推断类型是否来自模板化类的方法
Way to deduce if type is from a templated class
我一直在试图回答标题中的问题,但我被难住了。基本上,尝试查看是否有一种内置方法来告诉模板实例化的"来源",至少对于类而言。以下是我想做的一个例子:
template<class T>
class A { };
auto a = A<int>();
template<class T>
auto someFunction(T item) {
if(/* if type of a is from the templated class A */) {
// yep A<int> is 'from' A.
}
}
这可能吗,以这样的方式?我可以使用一些保存的值或继承恶作剧来获得类似的东西,但我宁愿不这样做。
也许具有自定义类型特征。
如下内容
template <typename>
struct is_A : public std::false_type
{ };
template <typename T>
struct is_A<A<T>> : public std::true_type
{ };
// ...
template <typename T>
auto someFunction(T item) {
if( is_A<T>::value ) {
// yep A<int> is 'from' A.
}
}
或者,也许,您希望拦截不仅仅是A<T>
,但一般来说,所有模板类型,也许具有未定义数量的模板参数?
在这种情况下,您可以尝试如下内容
template <typename>
struct is_template : public std::false_type
{ };
template <template <typename...> class C, typename ... Ts>
struct is_template<C<Ts...>> : public std::true_type
{ };
问题:此类型特征使用类型模板参数截获所有模板类型,并且仅截获模板参数。但不会截获接收类型和一些非类型模板参数的std::integer_sequence<int, 0, 1, 2, 3, 4, 5>
。
您可以为 is_template
添加其他特化,以截获其他情况,但不能定义捕获所有模板类型(模板参数的所有组合(的特化。
使用类型特征
#include <type_traits>
#include <iostream>
template<class T>
class A { };
auto a = A<int>();
template <typename X>
struct is_from_A : std::false_type {};
template <typename T>
struct is_from_A<A<T>> : std::true_type {};
int main() {
std::cout << is_from_A<int>::value << "n"; // 0
std::cout << is_from_A<A<int>>::value << "n"; // 1
}
<</div>
div class="answers"> 另一种方式,允许派生类匹配:
template <typename T>
std::true_type is_an_A_impl(A<T>*);
std::false_type is_an_A_impl(...);
template <typename T>
using is_a_A = decltype(is_an_A_impl(std::declval<T*>()));
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 调用具有未标识类型的类的方法
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 我的模板类方法返回错误类型?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何在没有实例的情况下获取非静态方法的类型?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- 检查子类型时的专用方法模板
- C ++类型特征:确保子类实现方法
- 标识派生类类型的正确方法(类型实体VS dynamic_case)
- 类方法类型的decltype