变量(或属性)可以等于类型吗?
A variable (or an attribute) can be equal to a type?
我想知道一个变量是否可以等于一个类型(这里是magic_type
(
#include <typeinfo>
template<typename T>
class C
{
public:
magic_type t;
t list;
T data;
C(void)
{
if (typeid(data) == typeid(int))
t = float; // so typeid(list) = typedid(float)
else
t = int; // and typeid(list) = typedid(int)
}
};
如果您希望在T == int
时float
magic_type
,否则float
,请使用std::conditional_t
。这将在编译时解析magic_type
。
为了检查两种类型是否相同,您可以使用std::is_same_v
.包括<type_traits>
,用于两种性状的用法。
#include <type_traits> // std::conditional_t, std::is_same_v
template<typename T>
class C
{
// type alias
using magic_type = std::conditional_t<std::is_same_v<T, int>, float, int>;
magic_type t; // now `magic_type` == `float` if `T` == `int`, otherwise `float`
T data;
public:
// ... code
};
在不嵌套和保持逻辑代码更熟悉的情况下执行此操作的一般方法是使用if constexpr
帮助程序:
// Not needed if you know you can default-construct every type.
template<typename T>
struct type_t {
using type = T;
};
static auto get_list_type() {
if constexpr (std::is_same_v<T, int>) {
return type_t<float>{};
} else if constexpr (std::is_same_v<T, float>) {
return type_t<int>{};
} else if constexpr (...) {
return ...;
} else {
return ...;
}
}
typename decltype(get_list_type())::type list; // no typename in C++20
如果你有这样的倾向,那里也有几个编译时switch
库。
相关文章:
- 是否可以根据其数据成员的类型确定类型的大小
- 如何对命名空间限定类型进行类型定义?
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 类型名称 T::类型::值中的预期非限定 id
- if(双精度类型 == 字符类型)
- 专用于类型集的函数模板
- E/libc++abi:终止于类型为google::protobuf::FatalException的未捕获异常
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 如何在模板参数中分离函数类型返回类型和参数
- 对于类型类::类型,我可以从常量类派生常量类::类型吗?
- 应用于类型别名声明的 [[maybe_unused]] 属性的语法
- 二元运算符"<<"不能应用于类型 "wostream" 和 "string" 的表达式
- 如何在模板类中声明特定于类型的模板朋友函数
- go等价于c类型
- 如何初始化模板化类中依赖于T类型的静态const成员
- 为什么std::to_string的实现会创建一个4倍于类型大小的缓冲区?
- Haskell等价于c++类型对
- 模板函数中特定于类型的静态声明
- 为什么映射上的BOOST_FOREACH只适用于类型定义