如何确定一个类型是否是某个特定类型的模板化类型
How to find out if a type is a templated type of some specific type?
在下面的代码中:
template <typename T>
struct templatedStruct
{
};
template <typename T>
void func(T arg)
{
// How to find out if T is type templatedStruct of any type, ie., templatedStruct<int> or
// templatedStruct<char> etc?
}
int main()
{
templatedStruct<int> obj;
func(obj);
}
从其他东西继承templatedStruct的唯一方法是什么?
struct Base {};
template <typename T>
struct templatedStruct : Base
{
};
template <typename T>
void func(T arg)
{
std::is_base_of_v< Base, T>;
std::derived_from<T, Base>; // From C++ 20
}
您可以为其定义类型特征。
template <typename T>
struct is_templatedStruct : std::false_type {};
template <typename T>
struct is_templatedStruct<templatedStruct<T>> : std::true_type {};
然后
template <typename T>
void func(T arg)
{
// is_templatedStruct<T>::value would be true if T is an instantiation of templatedStruct
// otherwise false
}
实时
您可以编写一个重载集,该集返回处理不同情况的结果,并相应地返回一个布尔值:
template <typename T>
constexpr bool check(T const &) { return false; }
template <typename T>
constexpr bool check(templatedStruct<T> const &) { return true; }
然后像这样使用:
template <typename T>
void func(T arg)
{
if(check(arg)) // this could be 'if constexpr' if you want only
// one branch to be compiled
// ...
}
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 有没有办法检查发送到变量的值是否是正确的类型,而它已经在该变量下?
- 检查一组类型是否是具有组合的子集
- 检查数值类型是否是另一个数值类型的子集
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 如何判断类型是否是特定模板类的实例
- 如何检查模板类型是否是变体类型的类型之一
- 检查对象的类型是否是从特定类继承的
- 如何检查类型是否是给定类模板的实例化
- 我可以使用 typeid() 来知道一个类型是否是枚举吗?
- 如何检测一个类型是否是另一个类型的可见基
- 确定模板化的类型是否是动态的
- C++:检查模板类型是否是可变模板类型之一
- 如何检查类型是否是 int 的类型定义
- 如何测试类型是否是带有非类型参数的模板的专门化
- 如何知道一个类型是否是std::vector的专门化
- 是否可以使用类型特征来检查类型是否是容器
- C++11: 如何检查类型是否是"heterogeneous"非类型参数的给定类模板的实例化?
- 如何使用type_info来判断类型是否是子类