gpt4 book ai didi

C++:试图在类中封装 std::enable_if

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:31 25 4
gpt4 key购买 nike

刚用SFINAE选函数模板的时候灵光一现封装std::enable_if在这样的结构中

template<typename T, typename U>
struct EnableWhenEqual
{
typedef typename std::enable_if<std::is_same<T, U>::value>::type type;
};

然后使用它,例如,像这样

template<typename T, typename U, typename Enable = EnableWhenEqual<T,U>::type >
void foo(T&& t, U&& u)
{
if (std::is_same<T,U>::value)
std::cout << "OK, overload allowed." << std::endl;
else
std::cout << "Bad. Should not compile!" << std::endl;
}

但是,这不起作用,正如调用

foo(1,1);     //prints "OK, overload allowed"
foo(1,2.0); //prints "Bad, should not compile", but obviously does

另一方面,通过尝试创造

EnableWhenEqual<int,int>();      //compiles
EnableWhenEqual<int,double>(); //does not compile because type does not exist

一个编译器错误(“类型不是 std::enable_if 的成员”)。

这种行为的原因是什么?我问是因为根据我对 SFINAE 的一点了解,我会认为类型推导中的错误会导致排除重载......?


为了完整性,上面的问题可以使用模板别名来解决

template <typename T, typename U>
using EnableWhenEqual = typename std::enable_if<std::is_same<T,U>::value>::type;

是否还有使用结构而不是模板别名的替代方法?

编辑:这里我指的是解决一般问题的实现。比如这里的这个

template<typename T, typename U, bool B, typename C=void>
struct EnableWhenEqual {};

template<typename T, typename U, typename C>
struct EnableWhenEqual<T,U,std::is_same<T,U>::value>
{
typedef typename C type;
};

不适合我,因为偏特化需要一个简单的标识符。如果可以,可以替换 std::is_same按一般结构 Condition<T,U> .还有其他选择吗?

最佳答案

这应该可以解决问题:

template<typename T, typename U>
struct EnableWhenEqual : std::enable_if<std::is_same<T, U>::value>
{
};

http://coliru.stacked-crooked.com/a/650202ba3d42d34b

关于C++:试图在类中封装 std::enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25630112/

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