gpt4 book ai didi

c++ - 使用 enable_if 为有符号和无符号变量创建可变参数构造函数

转载 作者:可可西里 更新时间:2023-11-01 18:28:00 25 4
gpt4 key购买 nike

我想为一个类创建一个构造函数,使用任何整数类型,但要区分有符号和无符号。我不希望它成为类本身的模板。以下不起作用。 Visual Studio 只是说没有参数匹配。

class Thing{
public:
template<typename Integral>
Thing(
typename std::enable_if<
std::is_integral<Integral>::value &&
!std::is_same<Integral,bool>::value &&
std::is_signed<Integral>::value
,Integral
>::type num
){
//constructor using signed variable as input
}
template<typename Integral>
Thing(
typename std::enable_if<
std::is_integral<Integral>::value &&
!std::is_same<Integral,bool>::value &&
!std::is_signed<Integral>::value//notice this is different
,Integral
>::type num
){
//constructor using unsigned variable as input
}
};

最佳答案

我们需要将 SFINAE 移动到模板中。如果我们使用

class Thing{
public:
template<typename Integral, typename std::enable_if<
std::is_integral<Integral>::value &&
!std::is_same<Integral,bool>::value &&
std::is_signed<Integral>::value
,Integral>::type* = nullptr> // will fail if type does not exist
Thing(Integral i)
// ^ use Integral type here
{
std::cout << "signed\n";
}
template<typename Integral, typename std::enable_if<
std::is_integral<Integral>::value &&
!std::is_same<Integral,bool>::value &&
!std::is_signed<Integral>::value//notice this is different
,Integral>::type* = nullptr>
Thing(Integral i)
{
std::cout << "unsigned\n";
}
};

int main()
{
int a = 10;
Thing b(a);
unsigned int c = 10;
Thing d(c);
}

我们得到

signed
unsigned

Live Example

我还必须将构造函数设置为public,因为它们默认是private

关于c++ - 使用 enable_if 为有符号和无符号变量创建可变参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137433/

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