gpt4 book ai didi

c++ - 将自定义谓词定义为 std::is_same 的组合

转载 作者:行者123 更新时间:2023-11-30 05:21:00 26 4
gpt4 key购买 nike

我有一个函数模板,我想限制可以实例化它的类型集。

我是这样写的:

template <typename T>
void DoSomething( /* ... Some parameters involving T ... */)
{
// Check at compile-time that T is allowed
static_assert(
std::is_same<T, int>::value
|| std::is_same<T, float>::value
|| std::is_same<T, double>::value
...
|| std::is_same<T, /* other type */>::value,
"Type not allowed");
}

我必须对其他函数模板重复相同的检查。

一个明显的解决方案是复制并粘贴上面的 static_assert检查,但这对代码的可维护性不利。

更好的解决方案可能是包装 static_assert checkin 一个临时辅助函数,并在我需要类型检查的每个函数模板中调用它。

但我认为更优雅的是定义 std::is_same自定义组合电话,我可以这样使用:

static_assert(IsTypeAllowed<T>::value, "Type not allowed");

如何定义我的自定义 IsTypeAllowed<T>作为 std::is_same 的组合电话 ||在一起了吗?

最佳答案

在 C++1z 中,您可以使用 std::disjunction 滚动您自己的特征:

template<typename T, typename... Others>
struct is_any : std::disjunction<std::is_same<T, Others>...>
{
};

那么就很简单了

static_assert(!is_any<int,char,bool>::value);
//static_assert(!is_any<int,char,bool,int>::value); //error

demo

您可以进一步映射它以获得您要求的确切接口(interface):

template<typename T>
using IsTypeAllowed = std::bool_constant<!is_any<T, char, bool, int>::value>;

如果你在 C++14 中需要这个,你不需要看 cppreference 提供的可能实现:

template<class...> struct disjunction : std::false_type { };
template<class B1> struct disjunction<B1> : B1 { };
template<class B1, class... Bn>
struct disjunction<B1, Bn...>
: std::conditional_t<B1::value != false, B1, disjunction<Bn...>> { };

关于c++ - 将自定义谓词定义为 std::is_same 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40429419/

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