推断类型是否来自模板化类的方法

Way to deduce if type is from a templated class

本文关键字:方法 类型 是否      更新时间:2023-10-16

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

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*>()));