gpt4 book ai didi

c++ - 如何根据模板类型使用 std::enable_if 来启用或禁用构造函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:07 31 4
gpt4 key购买 nike

我有以下模板化对象:

template< typename type_1, typename type_2 > struct result
{
// I want to enable these two constructors only if type_1 != type_2
result( type_1 f ) : foo{f} {}
result( type_2 b ) : bar{b} {}

// I want to enable this constructor only if type_1 == type_2
result( type_1 f, type_2 b ) : foo{f}, bar{b} {}

// Other member functions removed.

type_1 foo;
type_2 bar;
};

如何使用 std::enable_if 根据需要启用或禁用构造函数?

例如:

这个只有前两个构造函数:

result<string,int> // type_1 != type_2

这个只有第三个构造函数:

result<int,int> // type_1 == type_2

最佳答案

This似乎可行,但我不确定这是最佳方式

因此只需向构造函数添加具有默认值的新模板参数即可启用SFINAE

#include <type_traits>

template< typename type_1, typename type_2 >
struct result
{
// I want to enable these two constructors only if type_1 != type_2
template<typename T1 = type_1, typename T2 = type_2>
result( type_1 f,
typename std::enable_if<!std::is_same<T1, T2>::value>::type * = nullptr )
: foo{f} {}
template<typename T1 = type_1, typename T2 = type_2>
result( type_2 b,
typename std::enable_if<!std::is_same<T1, T2>::value, int >::type * = nullptr )
: bar{b} {} /* ^^^ need this to avoid duplicated signature error with above one*/

// I want to enable this constructor only if type_1 == type_2
template<typename T1 = type_1, typename T2 = type_2>
result( type_1 f, type_2 b,
typename std::enable_if<std::is_same<T1, T2>::value>::type * = nullptr )
: foo{f}, bar{b} {}

type_1 foo;
type_2 bar;
};

int main()
{
result<int, double> r(1);
result<int, double> r2(1.0);

result<int, int> r3(1, 2);

// disbaled
//result<int, double> r4(1, 2.0);
//result<int, int> r5(1);
}

另请阅读:Select class constructor using enable_if

关于c++ - 如何根据模板类型使用 std::enable_if 来启用或禁用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26644077/

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