gpt4 book ai didi

C++/模板 : Can I selectively disable a function of a class at compile time?

转载 作者:行者123 更新时间:2023-11-30 05:34:11 25 4
gpt4 key购买 nike

我需要为四元数类编写 2 个构造函数,该类基本上只包含 4 个数值类型的元素 T .我有 2 个构造函数在编译时发生冲突(见下文)。如果我想调用采用 4 个整数的构造函数,是否可以告诉编译器忽略迭代器中的构造函数(我的尝试被注释掉了——似乎编译器认为我的尝试是全有或全无来实例化整个类)。 (clang) 编译器投诉是“模棱两可的转换”,它在尝试执行 Quaternion<float> x(1); 时列出了这两个构造函数

通过我注释掉的尝试,clang 告诉我:

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)))
{}

Live Demo

关于C++/模板 : Can I selectively disable a function of a class at compile time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34364969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com