C 处理类模板及其类型的方法是什么?
What is the C++ way to deal with class templates and their types?
我以为我已经理解了C 中类模板的概念,但是查看我的代码,我不再确定了。说我有两个班级,一个非修订父母和一个小时候的模板,这样:
class MyParent
{
std::string m_Name;
MyParent(std::string Name) : m_Name(Name) { }
virtual const std::type_info& GetType() = 0;
};
template <class T>
class MyChild : public MyParent
{
T m_Var;
const std::type_info& GetType() override
{ return typeid(m_Var); }
};
现在,在我的代码中,我有一个使用其他类型的MyChild
实例的容器,例如:
MyParent* p1 = new MyChild<int>("one");
MyParent* p2 = new MyChild<float>("two");
MyParent* p3 = new MyChild<double>("three");
std::vector<MyParent*> v = {p1, p2, p3};
到目前为止,这很清楚,现在到我的混乱开始的地方。假设我在该向量上有一个迭代的函数,然后它需要对每个元素做一些事情。我刚刚构成的一个例子(我的问题不是关于代码本身,而是如何处理这种情况):
/* ... */
for(auto* p : v)
{
if(p->GetType() == typeid(int))
{
int val = p->m_Var;
std::list<int> lst = {val, 1, 2, 3};
if(val >= 0)
SomeTemplFuncPositive(v * v, lst); // a template variadic function
else
SomeTemplFuncNegative(v * v * -1, lst);
}
else if(p->GetType() == typeid(float))
{
/* ... now the same block c&p again for float? */
}
else if(p->GetType() == typeid(double))
{
/* ... and again for double?! */
}
}
/* ... */
在其他语言中,例如python,例如我只有一个代码块,但是在C 中,在我看来,我需要再次复制float
的整个代码块,而double
的时间又是另一个时间,等等。。
我不想怪C ,如果那是必须的,那就好了。我只是想知道,当在C 中使用这样的构建体时,这确实是正确的方法?
需要调整您的 virtual
-ity:
class MyParent
{
std::string m_Name;
MyParent(std::string Name) : m_Name(Name) { }
virtual void doSomething()=0;
};
template <class T>
class MyChild : public MyParent
{
T m_Var;
void doSomething() override
{
T val = this->m_Var;
std::list<T> lst = {val, 1, 2, 3};
if (val >= 0)
SomeTemplFuncPositive(v * v, lst);
else
SomeTemplFuncNegative(v * v * -1, lst);
}
};
现在,您通过其基类调用doSomething()
:
for(auto* p : v)
{
p->doSomething();
}
一切都完全写了一次。
如果您需要从基础到孩子,则代码很可能是错误的(至少在C 中)。当您将指针存储到衍生物中时,您应该确保您不需要公开访问其特定成员(但虚拟方法仍然可以这样做)。在这种情况下,应在派生中声明列表,并将T
作为模板参数。
另外,您不需要getType函数,可以使用dynamic_cast<DerivativeClass*>(baseClassPtr)
,如果铸件可以,则可以返回适当的指针,如果无法完成铸造,则可以使用Nullptr。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 调用具有未标识类型的类的方法
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 我的模板类方法返回错误类型?
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何在没有实例的情况下获取非静态方法的类型?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 使用类型id运算符的最佳替代方法
- Java 调用 dll 字符串返回类型方法
- C++ 如何绑定和调用模板化类型方法
- 将返回类型推断为模板参数类型方法
- 返回true的模板化类型方法是在条件中进行优化的良好候选者