确定C++变量模板类型的正确方法
Correct way of determening the template type of variable in C++
请考虑以下事项:
class fooBase{
public:
enum dataType {fooInt, fooFloat, fooInvalid};
fooBase(){}
/* void getLocation .. setLocation .. */
virtual dataType getDataType() = 0;
private:
int fooDataLocation;
};
template <typename T> class fooDataPoint : public fooBase{
public:
fooDataPoint(T foodat) :
fooData(foodat){}
dataType getDataType(){
if(typeid(float) == typeid(T))
return fooFloat;
if(typeid(int) == typeid(T))
return fooInt
return fooInvalid;
}
private:
T fooData;
};
template <typename T> class calculatableFooDataPoint : public fooBase{
public:
fooDataPoint(T foodat, T bardat) :
fooData(foodat){}
dataType getDataType(){
if(typeid(float) == typeid(T))
return fooFloat;
if(typeid(int) == typeid(T))
return fooInt
return fooInvalid;
}
void doCalculation(){
foodata *= barData;
}
/* .. getData .. */
private:
T fooData;
T barData;
};
std::vector<foobase *> fooVector;
这将使我能够在向量中存储不同类型的数据。然后,当我需要转换时,与其浏览无穷无尽的dynamic_case<class<type> *>(pointer)
列表,不如先检查数据类型,然后转换为正确的类类型。
此外,在序列化和反序列化数据点时(我只需要保存结构,而不是已处理的实际数据),我可以使用 getDataType 来确定类型并编写它的序列化形式。
我想我的底线是,使用 typeid(type) 进行比较是一个坏主意,为什么?
其次,是否有一个设计模型可以涵盖这样的案例?
我想我的底线是,使用 typeid(type) 进行比较是一个坏主意,为什么?
在这种情况下,我相信是的。T
的类型在编译时是已知的,因此没有理由通过一系列if
来确定您已经知道的内容。你可以为此编写一个简单的元函数。此外,无需使用动态调度来确定函数的类型,您可以将值存储在基数中:
class fooBase {
enum dataType { fooInt, fooFloat, … };
const dataType type;
fooBase(dataType t) : type(t) {}
…
dataType getDataType() const { return type; }
};
template <typename T>
struct DataType;
template <> struct DataType<int>
{ static const dataType value = fooBase::fooInt; };
template <> struct DataType<float>
{ static const dataType value = fooBase::fooFloat; };
那么dataPoint
的构造函数将是:
template <typename T>
fooDataPoint<T>::fooDataPoint(T data)
: fooBase(DataType<T>::value)
, fooData(data)
{}
除此之外,该设计对于可扩展性并不是那么好,因为需要针对您可能想要包含的任何类型的T
更新基础(扩展枚举),但如果事先知道集合,那可能不会太大的负担。
如果选项的数量有限,并且对象的大小不太不同,则可以使用预构建的解决方案,例如 boost::variant
,其优点是不需要动态分配,也不会强制层次结构。 潜在的缺点是,作为一个可区分的联合,每个对象的大小大约是它所持有的最大类型的大小(sizeof
)。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 调用具有未标识类型的类的方法
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 我的模板类方法返回错误类型?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何在没有实例的情况下获取非静态方法的类型?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- 检查子类型时的专用方法模板
- C ++类型特征:确保子类实现方法
- 标识派生类类型的正确方法(类型实体VS dynamic_case)
- 类方法类型的decltype