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

标签 c++ c++-concepts c++20

随着 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/

相关文章:

c++ - 简单的 Boost TCP 服务器,书中的示例 "C++ Crash Course"

c++ - 在 C++20 中仍然无法转发所有可调用对象吗?

c++ - 满意和建模的概念?

C++ 概念与 static_assert

c++ - 未评估上下文中的默认模板参数和 lambda : bug or feature?

c++ - 成员函数指针的类型推导

c++ - 在 libxml2 中使用 https 解析页面

c++ - 阅读未知数量的单词

c++ - 为什么我找不到我的着色器属性?

c++ - 函数不能用作 'constexpr' 函数