gpt4 book ai didi

c++ - 函数是否可能只接受给定参数的一组有​​限类型?

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

我知道如何使用模板处理任何数据类型:

template<typename T>
T myFunc(T data) { ... }

但是有没有办法将允许类型的集合缩小到例如 intcharstd::stringstd::wstring,所以编译器会在遇到不允许的参数类型时抛出错误,我会在编译时而不是运行时得到错误?

编辑:非常感谢 ecatmur,现在我理解了整个概念。

template<typename itemA_type, typename itemB_type>
typename std::enable_if<
(
std::is_same<itemA_type, int>::value ||
std::is_same<itemA_type, char>::value) &&
(
std::is_same<itemB_type, std::string>::value ||
std::is_same<itemB_type, std::wstring>::value ||
std::is_same<itemB_type, const char*>::value ||
std::is_same<itemB_type, const wchar_t*>::value
) ,
void
>::type
myFunction(itemA_type itemA, itemB_type itemB) {
using namespace std;
cout << itemA << itemB << endl;
}

最佳答案

采用这个效用特征类:

template<typename T, typename U, typename... Us>
struct is_any_of
: std::integral_constant<
bool,
std::conditional<
std::is_same<T,U>::value,
std::true_type,
is_any_of<T,Us...>
>::type::value
>
{ };

template<typename T, typename U>
struct is_any_of<T,U> : std::is_same<T,U>::type { };

然后你可以在静态断言中使用它:

template<typename T>
T myFunc(T data)
{
static_assert( is_any_of<T, int, char, std::string>{}, "T not allowed");
}

如果您觉得更合适,可以使用 std::is_convertiblestd::is_constructible 代替 std::is_same

Live example.

关于c++ - 函数是否可能只接受给定参数的一组有​​限类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24018688/

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