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

Concept to check for variadic template function

本文关键字:函数 变参 参数 检查      更新时间:2023-10-16

随着C++20和概念的到来,我想知道是否有可能编写一个概念来检查类型是否具有具有特定名称的函数,该函数需要任意数量的任意参数。

以以下代码为例(使用 GCC 当前的概念 TS 语法):

template <typename T>
concept bool Initializable = requires(T t) {
{ t.init() } ->void;
};
struct S {
void init() {}
};
static_assert(Initializable<S>);

概念 可初始化 检查类型是否实现了 void init() 函数。现在让我们假设还有另一种类型,它也有一个 init 函数,但需要参数,例如 int:

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

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

有没有办法让可初始化概念忽略函数参数?这个例子可能看起来相当派生,但对于像泛型序列化程序这样的东西,可能有这样一个概念的用例。

有一个类型特征,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;