检查可变参数模板函数的概念
Concept to check for variadic template function
随着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;
相关文章:
- C++ gmock - 我们如何在单元测试 cpp 文件中读取/获取 cpp 文件函数的参数值
- 访问函数变体时"Invalid conversion"错误
- 创建函数变体向量时"No matching function for call"错误
- 如何使用 SFINAE 来防止模板函数变窄?
- 如何在 c++ 中将 1 个函数变量值发送到另一个函数
- C++记录每个函数和参数值
- 谷歌模拟函数改变参数值
- 将函数形参的实参解包到c++模板类
- 函数对象应该是函数实参还是它的引用?
- 如何传递操作符作为默认函函数实参
- c++ const函数形参.有没有一种方法可以只声明函数的单个签名?
- Const正确性- Const指针作为函数实参
- 关于将指向数组的指针作为函数形参的混淆
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 通过函数实参而不是模板形参获取元组的元素
- 在函数实参中使用模板形参不适用gcc4.8
- 作为函数形参传递的Vector初始化器列表
- 指向函数形参的指针vs函数形参
- 在模板化类和函数上下文中以默认值作为函数形参的函子:-)
- 带std::函数形参的重载操作符