成员模板静态函数的类型特征
Type trait for member template static function
我对C++的类型特征有问题。我习惯于进行SFINAE检查以确保函数是否存在。但是,我希望有一个特征可以判断一个类是否具有特定的模板成员静态函数。
这个例子将有助于解释我的问题。假设 doMake
函数将函数指针作为参数,将其参数作为包。
struct A {
static A construct(int mA, double mB) {
return A{mA, mB};
}
int a;
double b;
};
struct B {
// silly but some of my code need this
template<typename T>
static B construct(int mA, T mB) {
return B{mA, mB};
}
int a;
double b;
};
struct Container {
// function (1)
template<typename T, typename... Args,
typename std::enable_if<has_template_construct<T>::value, int>::type = 0>
T make(Args&&... args) {
return doMake(&T::construct<Args...>, std::forward<Args>(args)...);
}
// function (2)
template<typename T, typename... Args,
typename std::enable_if<has_construct<T>::value, int>::type = 0>
T make(Args&&... args) {
return doMake(&T::construct, std::forward<Args>(args)...);
}
// function (3)
template<typename T, typename... Args,
typename std::enable_if<!has_construct<T>::value, int>::type = 0>
T make(Args&&... args) {
return T{std::forward<Args>(args)...};
}
};
// ...
int main() {
Container c;
auto a = c.make<A>(1, 5.7); // would call (2)
auto b = c.make<B>(2, 5.8); // would call (1)
auto d = C.make<float>(4.f); // obviously call the last
return 0;
}
我知道如何实现has_construct
,但我对如何实现has_template_construct
感到很迷茫。有人可以给我一些提示吗?谢谢!
使用实验is_detected您可以执行以下操作:
template<class T>
using construct_t = decltype(&T::construct);
template<class T, typename...Ts>
using template_construct_t = decltype(&T::template construct<Ts...>);
template <typename T>
using has_construct = is_detected<construct_t, T>;
template <typename T, typename...Ts>
using has_template_construct = is_detected<template_construct_t, T, Ts...>;
请注意,在函数 1 中,您必须使用 has_template_construct<T, Args...>::value
(,Args...
添加)。
相关文章:
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C ++类型特征:确保子类实现方法
- 根据类型特征更改函数定义?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 在C++中创建新的类型特征
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::begin-类型特征中未考虑用户定义的重载
- 在类型特征修改后,无法限定类型
- 使用类型特征的部分类专用化
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 了解类型特征的体系结构
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- 有了C++类型特征,有没有办法避免铸造
- 哪种类型特征表明该类型是可分配的?(元组,对)
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 如何使用类型特征正确推断引用的参数
- 如何通过扩展以下类型特征来删除 decltype(&MyClass::funct) 部分?
- 从标准库类型特征继承
- 为什么类型特征不适用于命名空间范围内的类型?