【发布时间】:2016-08-19 03:04:36
【问题描述】:
我有一个带有模板参数Tuple 的类foo,我想提供一个可变参数构造函数来初始化Tuple 类型的成员变量m_elements,只要定义了表达式m_elements{ static_cast<typename Tuple::value_type>(std::forward<Elements>(elements))... }。
我们可以通过以下方式做到这一点:
template<class Tuple>
struct foo
{
using value_type = typename Tuple::value_type;
template<class... Elements, class U = Tuple,
class = decltype(U{ static_cast<value_type>(std::declval<Elements>())... })>
foo(Elements&&... elements)
: m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
{}
Tuple m_elements;
};
现在,这个构造函数是否启用也应该取决于其他一些条件。所以,我需要写一些类似的东西
template<class... Elements, class U = Tuple,
class = std::enable_if_t</* some other conditions depending on U */>,
class = decltype(U{ static_cast<value_type>(std::declval<Elements>())... })>
我想根据std::is_constructible 检查我的第一个条件,以便我可以将此检查移至enable_if。这可能吗?我尝试使用std::is_constructible_v<U, decltype(static_cast<value_type>(std::declval<Elements>()))...>,但这似乎并不等同于之前的检查。
例如,foo<bar<3>>{1, 2, 3}; 与
template<std::size_t N>
struct bar
{
using value_type = double;
double data[N];
};
将使用前一次检查进行编译,但使用新检查会产生错误。
【问题讨论】:
-
具有讽刺意味的是,
foo在Tuple=std::tuple时不起作用,因为std::tuple没有value_type属性,所以你没有真正工作这里有元组(在异构编译时集合的意义上)。 -
@Tim 这并不是那么讽刺。我真正的
foo在数学库中,数学家通常将向量定义为 n 元组。 -
啊,那种元组。这更有意义。
标签: c++ templates c++14 typetraits