检查可变参数模板函数的概念

Concept to check for variadic template function

随着 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>);

Initializable 概念检查类型是否实现了 void init() 函数。现在假设还有另一种类型,它也有一个 init 函数,但需要参数,例如一个整数:

struct T {
  void init(int) {}
};

现在在这种情况下,静态断言会失败。

有什么方法可以让 Initializable 概念忽略函数参数吗?这个例子可能看起来相当派生,但对于像通用序列化器这样的东西,可能会有这样一个概念的用例。

有一个类型特征,std::is_member_function_pointer。但是如果你希望 return 类型也是 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;