键入trait以检查参数包中的所有类型是否可复制构造

时间:2015-04-13 10:42:45

标签: c++ templates c++11 typetraits

我需要一个类型特征来检查参数包中的所有类型是否都是可复制构造的。这就是我到目前为止所做的。 main函数包含一些测试用例,用于检查功能。

#include <type_traits>
#include <string>
#include <memory> 

template <class... Args0toN>
struct areCopyConstructible;

template<>
struct areCopyConstructible<> : std::true_type {};

template <class Arg0, class... Args1toN, class std::enable_if< !std::is_copy_constructible<Arg0>::value>::type* = nullptr >
struct areCopyConstructible : std::false_type {};

template <class Arg0, class... Args1toN, class std::enable_if< std::is_copy_constructible<Arg0>::value>::type* = nullptr >
struct areCopyConstructible : areCopyConstructible<Args1toN...> {};

int main()
{
  static_assert(areCopyConstructible<>::value, "failed");
  static_assert(areCopyConstructible<int>::value, "failed");
  static_assert(areCopyConstructible<int, std::string>::value, "failed");
  static_assert(!areCopyConstructible<std::unique_ptr<int> >::value, "failed");
  static_assert(!areCopyConstructible<int, std::unique_ptr<int> >::value, "failed");
  static_assert(!areCopyConstructible<std::unique_ptr<int>, int >::value, "failed");
}

Link to Live Example

我的想法是递归检查,包的头部元素是否是可复制构造的,然后继续进行尾随。不幸的是,我没有这个想法来编译。我对可变参数模板的了解不是很先进。我想,启用 - 如果在模板列表中的参数包之后不起作用。我不知道。有没有人有一个好的建议,如何解决问题?

2 个答案:

答案 0 :(得分:10)

我更喜欢@Columbo的bool_pack技巧。首先是一个模板,用于测试bool参数包中的所有内容是否为true

template<bool...> struct bool_pack;
template<bool... bs> 
using all_true = std::is_same<bool_pack<bs..., true>, bool_pack<true, bs...>>;

然后

template<class... Ts>
using areCopyConstructible = all_true<std::is_copy_constructible<Ts>::value...>;

答案 1 :(得分:4)

我知道这是一个老问题,但由于我们很快就会有C ++ 17,所以我鼓励你看看std::conjunction。有了它,你可以写这样的东西

template <typename ...Args>
using areCopyConstructible = typename std::conjunction<std::is_copy_constructible<Args>...>::type;