随着 C++20 和概念的出现,我想知道是否可以编写一个概念来检查 Type 是否具有具有特定名称的函数,该函数采用任意数量的任意参数。
以下面的代码为例(使用GCC当前的概念TS语法):
template <typename T>
concept bool Initializable = requires(T t) {
{ t.init() } ->void;
};
struct S {
void init() {}
};
static_assert(Initializable<S>);
Initialized 概念检查 Type 是否实现了 void init() 函数。现在假设还有另一种类型,它也有一个 init 函数,但需要参数,例如一个整数:
struct T {
void init(int) {}
};
现在在这种情况下静态断言将会失败。
有什么方法可以让Initialized概念忽略函数参数吗?这个例子可能看起来相当派生,但对于像通用序列化器这样的东西,可能有这样一个概念的用例。
最佳答案
有一个类型特征,std::is_member_function_pointer
。但如果您希望返回类型也是 void
,那么您可以同时执行以下操作:
template <typename>
struct mptr_returns_void : std::false_type {};
template <typename T, typename ...Args>
struct mptr_returns_void<void(T::*)(Args...)> : std::true_type {};
template <typename T>
concept Initializable = mptr_returns_void<decltype(&T::init)>::value;
关于c++ - 检查可变参数模板函数的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55763910/