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