变量(或属性)可以等于类型吗?

A variable (or an attribute) can be equal to a type?

本文关键字:类型 于类型 属性 变量      更新时间:2023-10-16

我想知道一个变量是否可以等于一个类型(这里是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 == intfloatmagic_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库。