【发布时间】:2016-03-04 22:29:42
【问题描述】:
给定一个带有模板参数typename T 和class Tuple 的类,如果Tuple 具有std::vector 类成员函数reserve 和push_back,我想提供一个特殊的构造函数。如果Tuple 没有这样的成员函数,那么我想提供一个特殊的构造函数,如果Tuple 可以从可转换为T 的类型的可变参数构造,即
template<typename T, class Tuple>
class vector
{
template<typename... Elements,
typename = decltype(std::declval<Tuple>().push_back(T())),
typename = decltype(std::declval<Tuple>().reserve(size_type()))>
vector(Elements&&... elements)
{ /* ... */ }
template<typename... Elements, typename = typename = decltype(Tuple{ static_cast<T>(std::declval<Elements>())... })>
vector(Elements&&... elements)
{ /* ... */ }
};
问题 1: 显然,在上面的代码中,编译器并不知道我想尽可能采用第一个构造函数。无论如何,我怎样才能实现所需的行为?
问题2:假设第一个构造函数不存在,为什么下面的代码会导致编译器报错“cannot convert from initializer list to
vector<double, Tuple<double>>”:
template<typename T>
class Tuple
{
public:
Tuple() { }
Tuple(std::initializer_list<T>) { }
};
int main()
{
vector<double, Tuple<double>> x = { 1, 2, 3 };
return 0;
}
【问题讨论】:
标签: c++ templates c++14 variadic-templates typetraits