C ++ 11中的合取类型特征

谢尔盖·科列斯尼克(Sergey Kolesnik)

我需要检查可变参数std::enable_if

使用C ++ 17我会写:

template <typename A, typename ...B>
class Foo : public A, public B...
{

public:

    template <typename = std::enable_if_t<std::is_default_constructible_v<A> &&
        (std::is_default_constructible_v<B> && ...)>>
    Foo()
    {}
    
    Foo(A &&a, B && ... b)
       : A(std::forward<A>(a)),
       B(std::forward<B>(b))...
    {}

};

但是C ++ 11没有以这种方式扩展参数包的功能。它也没有提供std::conjunction

与C ++ 11结合实现的简单方法是什么?我想带有递归的SFINAE就足够了,但是我无法缠住它。

马雷克

您需要一个工具来对可变参数进行合取运算。

#include <iostream>
#include <type_traits>

template<class...> struct conjunction : std::true_type { };
template<class B1> struct conjunction<B1> : B1 { };
template<class B1, class... Bn>
struct conjunction<B1, Bn...> 
    : std::conditional<bool(B1::value), conjunction<Bn...>, B1>::type {};

template <typename A, typename ...B>
class Foo : public A, public B...
{

public:

    template <typename std::enable_if<std::is_default_constructible<A>::value &&
        conjunction<std::is_default_constructible<B>...>::value, bool>::type = true>
    Foo()
    {}
    
    Foo(A &&a, B && ... b)
       : A(std::forward<A>(a)),
       B(std::forward<B>(b))...
    {}

};

struct A {};
struct B {};
struct C {
    C(int x) {}
};

int main()
{
    Foo<A, B> foo;
    //Foo<A, B, C> bar;

    return 0;
}

https://godbolt.org/z/d3jvM4

基于https://en.cppreference.com/w/cpp/types/conjunction(可在C ++ 17中使用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++类型特征

来自分类Dev

C ++类型特征

来自分类Dev

特征矩阵的Cholesky的Eigen和C ++ 11类型推断失败

来自分类Dev

推导c ++ 11中的元组元素的类型

来自分类Dev

使用自定义特征和bool类型的c ++ 11枚举时clang的编译错误

来自分类Dev

C ++ 11中具有C链接的复杂类型

来自分类Dev

C ++ 11中具有C链接的复杂类型

来自分类Dev

在C ++ 11中的lambda参数中推导类型

来自分类Dev

C ++ 11中类型推导中的右值引用

来自分类Dev

如何获取C ++ 11参数包中的类型?

来自分类Dev

确定C ++ 11中的通用返回类型时出错

来自分类Dev

什么时候允许c ++ 11中的类型被记忆?

来自分类Dev

C ++ 11中多个数值类型的向量

来自分类Dev

C11中类型名称范围的概念

来自分类Dev

模板方法中的C ++ 11自动返回类型

来自分类Dev

在C11中什么算作字符类型?

来自分类Dev

如何推断C ++ 11中的模板参数类型?

来自分类Dev

如何在C ++ 11中定义强ID类型?

来自分类Dev

C11中类型名称范围的概念

来自分类Dev

C ++特征库中的argmax()方法

来自分类Dev

指针忽略了C中的无符号特征?

来自分类Dev

C++ 中的分段错误(特征库)

来自分类Dev

在C ++ 11 / C ++ 14中的类中存储对象类型的列表/映射

来自分类Dev

简单可序列化的C ++类的类型特征

来自分类Dev

根据C ++标准的定义实现“ is_similar”类型特征

来自分类Dev

在C ++ 11或C ++ 1y中对非类型模板参数包进行排序?

来自分类Dev

为什么以及额外的括号会如何更改C ++(C ++ 11)中的表达式类型?

来自分类Dev

从C ++ / C ++ 11中的函数返回不同值类型的优雅方法

来自分类Dev

如何在C ++ 11中约束参数包类型?以及如何在cpp中实现模板?

Related 相关文章

热门标签

归档