检查可变参数模板函数的概念
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;
随着 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;