当前位置:  开发笔记 > 编程语言 > 正文

如何使用C++ 14和C++ 1z中的功能缩短这个可变参数模板代码?

如何解决《如何使用C++14和C++1z中的功能缩短这个可变参数模板代码?》经验,为你挑选了2个好方法。

这是一个代码片段,我将使用它来检查可变参数模板类型是否是唯一的:

template 
struct is_one_of;

template 
struct is_one_of {
    static constexpr bool value = false;
};

template 
struct is_one_of {
    static constexpr bool value =
        std::is_same::value || is_one_of::value;
};

template 
struct is_unique;

template <>
struct is_unique<> {
    static constexpr bool value = true;
};

template 
struct is_unique {
    static constexpr bool value =
        is_unique::value && !is_one_of::value;
};

int main() {
    constexpr bool b = is_unique::value;
    constexpr bool c = is_unique::value;
    static_assert(b == true && c == false, "!");
}

有没有办法使用C++ 14和C++ 1z中引入的功能使这段代码更短和/或更简洁?或者是否有更好的方法来使用新功能实现相同的效果?

在C++ 1z的情况下,我的意思是:最新版本的Clang和GCC中已有的功能.



1> Jonathan Wak..:

我们最近将std :: disjunction添加到了C++ 1z草案中,它可以用于is_one_of(并且一旦找到匹配就停止实例化,请参阅链接以获取更多详细信息):

template 
  using is_one_of = std::disjunction...>;

这已在GCC主干中实现.对于旧版本的GCC,您可以使用实现细节__or_:

template 
  using is_one_of = std::__or_...>;

或者disjunction使用C++ 11工具手动实现,如上面链接的提案末尾所示.



2> Piotr Skotni..:
#include 

template 
constexpr bool is_one_of = (std::is_same{} || ...);

template 
constexpr bool is_unique = true;

template 
constexpr bool is_unique = is_unique && !is_one_of;

DEMO

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有