gpt4 book ai didi

C++ 模板 - 仅当模板参数中存在特定值时才添加函数

转载 作者:行者123 更新时间:2023-12-02 07:41:10 25 4
gpt4 key购买 nike

我在这里尝试的事情有可能吗?

我知道#if 不适用于模板参数。

请不要教我属性如何违背 C++ 的思想,这不是这里的问题。

typedef enum {
kPropertyReadWrite,
kPropertyReadOnly
} PropertyType;


template <typename T, PropertyType P = kPropertyReadWrite>
class property {
T value;
public:
property() {}
property(T initValue) : value(initValue){}


#if P == kPropertyReadOnly
T & operator = (const T &i) {
//::std::cout << i << ::std::endl;

return value = i;
}
#endif

operator T const & () const {
return value;
}
};

最佳答案

令我惊讶的是,这么多人都无法正确理解 SFINAE。 SFINAE 条件需要依赖于模板参数 operator= ,而不是类模板。否则,实例化类模板可能会导致硬错误。

template<PropertyType P1 = P, typename std::enable_if<P1 != kPropertyReadOnly, int>::type = 0>
T & operator = (const T &i) {
//::std::cout << i << ::std::endl;

return value = i;
}

请注意,这实际上不足以阻止 property<int, kPropertyReadOnly> p2; p2 = 10;编译,因为您的代码定义了从 T 的隐式转换至property<T, ...> ,因此编译器将隐式转换 10property然后调用复制赋值运算符。

关于C++ 模板 - 仅当模板参数中存在特定值时才添加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34381400/

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