繁体   English   中英

是否可以检查类型是否已使用特定模板参数实例化?

Is it possible to check if a type has been instantiated with a specific template parameter?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

不太确定我的术语是否 100% 正确,所以这是代码:

template<class... Ts>
struct Empty { };

int main() {
   using T = Empty<int, double>;
   // How to check if T "contains" double?

   return 0;
}

所以这特别适用于接受多种模板类型的类型。 这也最好是在编译时。 如果不需要该类型的对象,则加分。

我能得到的最接近的(在帮助下)是这样的:

template <class check, class T, class... U>
constexpr bool contains_type(){
   if constexpr (std::is_same_v<T, check>)
      return true;
   else if constexpr (sizeof...(U) > 0)
      return contains_type<check, U...>();
   else
      return false;
}


template <class check, template<class> class TypeToCheck, class... T>
constexpr bool does_obj_contain_type(TypeToCheck<T...>) {
   if constexpr (sizeof...(T) > 0)
      return contains_type<check, T...>();
   else
      return false;
}

constexpr bool does_contain_double = does_obj_contain_type<double>(T{});

它包含我从未见过的 C++ 语法,但它有效。 如果不需要T{}对象会很整洁。 也许看起来更理智一些。

2 个回复

不确定你到底想要什么......但我想是这样的

template <class check, template<class...> class TypeToCheck, class... T>
constexpr bool does_obj_contain_type(TypeToCheck<T...>) {
   return (std::is_same_v<check, T> || ...);
}

// ...

using T = Empty<int, double>;

auto x = does_obj_contain_type<double>(T{});

但是如果你不能实例化一个类型为T的对象,这是一个问题。 在这种情况下,我想您可以使用类/结构专业化。

某事如

template <typename>
struct does_obj_contain_type;

template <template <typename...> class TTC, typename ... Ts>
struct does_obj_contain_type<TTC<Ts...>>
 {
   template <typename check>
   static constexpr bool func ()
    { return (std::is_same_v<check, Ts> || ...); }
 };

 // ...

 using T = Empty<int, double>;

 constexpr auto x = does_obj_contain_type<T>::func<double>();

或者作为模板变量value可能更好(由 super 建议:谢谢!)

template <template <typename...> class TTC, typename ... Ts>
struct does_obj_contain_type<TTC<Ts...>>
 {
   template <typename Check>
   static constexpr auto value = (std::is_same_v<Check, Ts> || ...);
 };

// ...

using T = Empty<int, double>;

constexpr auto x = does_obj_contain_type<T>::value<double>;

这个问题已经得到了回答,但如果你想在某个时候解开Empty<> s 的层,我只会抛出一个扩展。

#include <iostream>
#include <type_traits>

// non templated types
template<class check, class... Ts>
struct contains_type {
    static constexpr bool value = (std::is_same_v<check, Ts> || ...);
};

// templated types
template <class check, template<class...> class TypeToCheck, class... Ts>
struct contains_type<check, TypeToCheck<Ts...>> {
    static constexpr bool value = 
        (std::is_same_v<check, Ts> || ...) ||     // if "check" is templated
        (contains_type<check, Ts>::value || ...); // unwrap one layer
};

// Helper variable template
template<class... Ts>
inline constexpr bool contains_type_v = contains_type<Ts...>::value;

template<class... Ts>
struct Empty { };

int main() {
   using False = Empty<int, float, float, long double>;
   using True = Empty<int, double, int>;
   using DoubleNestFalse = Empty<Empty<int>, Empty<int, float>>;
   using DoubleNestTrue = Empty<Empty<int>, Empty<double, float>>;
   
   std::cout << std::boolalpha;

   std::cout << contains_type_v<double, False> << '\n';
   std::cout << contains_type_v<double, True> << '\n';
   
   std::cout << contains_type_v<double, float> << '\n';              // false
   std::cout << contains_type_v<double, int, double> << '\n';        // true
 
   std::cout << contains_type_v<double, DoubleNestFalse> << '\n';
   std::cout << contains_type_v<double, DoubleNestTrue> << '\n';

   std::cout << contains_type_v<Empty<int>, DoubleNestTrue> << '\n'; // true
}
2 检查类型是否是模板的实例化

我想在编译期间检查类型是否是特定模板的实例化。 例如: std::vector&lt;int&gt;是std::vector实例化 std::array&lt;int, 5&gt;是std::array实例化 我可以进行适用于案例1的测试,但不适用于案例2。 ...

3 检查类型是否是模板的实例化

我有结构 但是is(DataT == RGBA)无法工作,因为DataT是一种类型而RGBA是一种模板。 相反,我需要检查类型是否是模板的实例化,以便声明file @FeepingCreature在评论中表示 虽然工作我没有关于alias void isRGBAStru ...

7 模板是否针对相同类型的参数实例化多次?

这是我的代码来解释这个问题: 在这段代码中,当调用get_data(20)时,在调用get_data(10)时已经存在int的代码扩展。 那么,它将再次扩展相同数据类型的代码还是使用扩展的代码? 请解释。 ...

9 C ++ 11:如何检查类型是否是“异构”非类型参数的给定类模板的实例化?

我知道检查类型是否是采用TYPE参数的类模板的实例化是很简单的,如下所述: 如何检查类型是否是给定类模板的实例化? 但是......是否有可能有一个可变的“is_instantiation_of__ntp &lt;...&gt;”(NTP代表非类型参数),它将接受具有任意数量的异构 NON ...

10 检查参数化类型是否为特定类型实例

我有一个带有模板参数的方法: 我以一种情况告终,可以用一个item来调用它,该item可以是一个内部匿名类,该类遵循预期的类,但是如何知道何时将该对象放入方法中呢? 如果我这样做if(item.equals(ConcreteA.class))其中ConcreteA是常见的类的作品失败 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM