c++ - 推断类型是否来自模板类的方法

标签 c++ templates types

我一直在尝试回答标题中的问题,但我被难住了。基本上,试图看看是否有内置的方法来告诉模板实例化的“来源”,至少对于类来说是这样。这是我想做的一个例子:

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 添加其他特化, 以拦截其他情况,但您不能定义捕获所有模板类型(模板参数的所有组合)的特化。

关于c++ - 推断类型是否来自模板类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387711/

相关文章:

c++ - 为什么我不能用 C++ 编译 HelloWorld?

c++ - WMI CPUTemp 始终返回相同的值

c++ - Qt上的UDP语音聊天

C++:将模板函数作为参数传递给其他模板函数时的模板参数推导

scala - Scala 中是否有可能 "curry"更高种类的类型?

Haskell:a -> a 类型函数的示例,除了标识

python - 如何将我自己的 Meta 类与 SQLAlchemy-Model 一起用作父类

c++ - 如何将指针映射公开为 const 指针映射?

c++ - 我需要 static_cast 我的数字模板值吗?

templates - 在模板中使用空对象,如何避免 NullPointerException?