gpt4 book ai didi

c++ - 有条件地启用替代赋值运算符

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:28 25 4
gpt4 key购买 nike

我正在尝试有条件地实例化一个额外的赋值运算符。下面的代码在 clang 中运行良好,但在 gcc 4.7 中却不行。

我遇到的问题似乎与此处提出的问题非常相似:std::enable_if to conditionally compile a member function

下面说明了我遇到的问题:

#include <type_traits>

template<typename T>
struct StrangerTypeRules;

template<typename T>
struct X;

template< >
struct StrangerTypeRules < unsigned > {
typedef unsigned type;
};

template< >
struct StrangerTypeRules < bool > {
typedef X<bool> type;
};

template<typename T>
struct X {
// In the non-trivial version of my code, I can not use the
// default assignment operator, therefor I need to define this one
X& operator=( const X<T>& rhs ) {
return *this;
}

// Alternative assignment oprtator, must only exists if it is
// different from the assignment operator above
template<typename =
typename std::enable_if<
( !std::is_same<
X<T>,
typename StrangerTypeRules<T>::type
>::value ),
X<T>
>::type
>
X<T> & operator=( const typename StrangerTypeRules <T>::type& rhs ) {
return *this;
}
};

int main(int argc, const char *argv[])
{
X<unsigned> x1, x2;

x1 = 4;
x2 = x1;

X<bool> x3, x4; // compile error in gcc 4.7 with -std=c++11
//x3 = x4;

return 0;
}

这能否以同时满足 clang 和 gcc 4.7 的方式完成?如果是,怎么办?

使用 gcc 时的编译错误:

test.cxx: In instantiation of ‘struct X<bool>’:
test.cxx:52:13: required from here
test.cxx:38:12: error: no type named ‘type’ in ‘struct std::enable_if<false, X<bool> >’

最佳答案

您需要制作 enable_if依赖于模板参数。就像现在一样,它只依赖于模板定义中的外部模板参数。但是,如果您从外部模板实例化一个类,那么实例化到该类中的赋值运算符模板不再依赖于模板参数,因为 T已经被替换了。

只需引入一个等于 T 的虚拟参数

template<typename T1 = T, typename =
typename std::enable_if<
( !std::is_same<
X<T1>,
typename StrangerTypeRules<T1>::type
>::value ),
X<T1>
>::type
>
X<T1> & operator=( const typename StrangerTypeRules <T1>::type& rhs ) {
return *this;
}

使用 T1enable_if<...> 中的其中一个地方模板参数已经足够了,因为这已经使 enable_if 成为可能。依赖。

然而,它不是给您的 operator= 的调用以前格式不正确,但它的声明与复制赋值运算符冲突,因此 enable_if在这里用处不大。只需将您的代码替换为

template<typename T1 = T>
X<T1> & operator=( const typename StrangerTypeRules <T1>::type& rhs ) {
return *this;
}

自此operator=是模板,不会和非模板重载冲突。而且因为它是一个模板,当你调用它时编译器会更喜欢非模板如果 TX<T> .

关于c++ - 有条件地启用替代赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9889101/

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