我需要为一个四元数类编写2个构造函数,该类基本上只包含4个数值类型T
的元素。我有两个构造函数在编译时发生冲突(见下文)。如果我想调用使用4 int的构造函数,是否可以告诉编译器忽略迭代器中的构造函数(我的尝试被注释掉了——编译器似乎认为我实例化整个类的尝试要么全有要么全无)。(clang)编译器抱怨"转换不明确",当尝试执行Quaternion<float> x(1);
时,它列出了这两个构造函数
随着我的评论尝试,叮当声告诉我:
error: no type named 'value_type' in 'std::__1::iterator_traits<float>'
typename std::enable_if<!std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type>
代码:
template <typename T>
class Quaternion {
public:
template<typename T1>
Quaternion(T1 a = 0, T1 b = 0, T1 c = 0, T1 d = 0)
: _a(static_cast<T>(a)),
_b(static_cast<T>(b)),
_c(static_cast<T>(c)),
_d(static_cast<T>(d)) { }
template <typename It>
//typename std::enable_if<!std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type>
Quaternion(It it)
: _a(static_cast<T>(++it)),
_b(static_cast<T>(++it)),
_c(static_cast<T>(++it)),
_d(static_cast<T>(++it))
{}
private:
T _a, _b, _c, _d;
};
您可以定义自定义特征is_iterator
:
template<typename T, typename = void>
struct is_iterator {
static bool const value = false;
};
template<typename T>
struct is_iterator<T, typename std::enable_if<!std::is_same<typename std::iterator_traits<T>::value_type, void>::value>::type> {
static bool const value = true;
};
并以以下方式用默认模板参数SFINAE出您的构造函数:
template<typename T1, typename = typename std::enable_if<!is_iterator<T1>::value>::type>
Quaternion(T1 a = 0, T1 b = 0, T1 c = 0, T1 d = 0)
:_a(static_cast<T>(a)),
_b(static_cast<T>(b)),
_c(static_cast<T>(c)),
_d(static_cast<T>(d))
{}
template <typename It, typename = typename std::enable_if<is_iterator<It>::value>::type>
Quaternion(It it)
:_a(static_cast<T>(*(++it))),
_b(static_cast<T>(*(++it))),
_c(static_cast<T>(*(++it))),
_d(static_cast<T>(*(++it)))
{}
实时演示