当前位置: 首页 > 知识库问答 >
问题:

C++:存储/记住模板类类型

芮岳
2023-03-14

假设我们有一个类,如下所示:

class AbstractContainer{
    ...
};

template <typename T>
class Container : public AbstractContainer {
    T someFunction();
};
class Interface{
public:
    Interface();
    void doSth();
private:
    AbstractContainer* container;
};
Interface::Interface(){
    if (/* some condition */)
        this->container = new Container<int>(25);
    } else {
        this->container = new Container<float>(25);
    }
    //here I'd need to remember of which type container is: int or float
}

因此,在这里,我需要以某种方式存储容器的类型(intfloat)。我知道在我的程序的这一点,它是完全确定的。我需要存储它,因为稍后我可能不得不将我的AbstractContainer*强制转换回Container * Container * ,例如在另一个函数中:

void Interface::doSth(){
    //here I have to recall what the type was
    if(/* type was int */) {
        dynamic_cast<Container<int>&>(*(this->container)).someFunction();
    } else {
        dynamic_cast<Container<float>&>(*(this->container)).someFunction();
    }
}

我考虑过使用包含所有不同受支持类型的值的enum并将该类型保存在该枚举类型的附加成员变量中。然后,我必须使用switch语句来检查所有不同的可能性并执行正确的强制转换。但是,我想是不是没有更简单的方法。

我主要想做的是存储interface的构造函数中使用的类型,然后在interface::dosth中重新调用它。

编辑:我必须说明函数someFunction依赖于模板参数t。因此,它不是一个选项,使它虚拟。

共有1个答案

令狐晟
2023-03-14

你可以这样做

void Interface::doSth(){
    if (auto* c_int = dynamic_cast<Container<int>*>(this->container)) {
        c_int->someFunction();
    } else if (auto* c_float = dynamic_cast<Container<float>*>(this->container)) {
        c_float->someFunction();
    }
}

但是为什么不将someFunction()移到基类中呢?并使用虚拟方法

 类似资料:
  • 存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类: auto register static extern mutable thread_local (C++11) 从 C++ 11 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。 auto 存储类 自 C++ 11

  • 我试图做到以下几点:一个模板化的类应该提供一些函数,这些函数取决于它模板化的类型是否包含一个具有给定名称的成员变量。作为示例,下面的伪代码应该只在模板化的结构/类具有名为“id”的成员时才提供“printId()”: 通过研究SFINAE,traits,std::enable_if和StackOverflow,我认为这是可以做到的...但是我不知为什么没有将enable_if与以下问题中的片段结合

  • 本文向大家介绍C++模板类的用法,包括了C++模板类的用法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++模板类的用法,分享给大家供大家参考。具体实现方法如下: main.h头文件如下: main.cpp源文件如下: 希望本文所述对大家的C++程序设计有所帮助。

  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 我的函数使用一组给定的输入参数(变量)调用Python函数,并返回包含函数输出的元组(变量,因为输出随调用的函数而变化)。 我正在使用C 11通过MinGW-w64编译器的g端口在视窗10机器上编译。我声明了这个模板变量函数(并调用它)如下: 但是,会引发此错误(为了可读性,缩短为):

  • 主要内容:使用类模板创建对象,综合示例C++ 除了支持 函数模板,还支持 类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。 声明类模板的语法为: template<typename 类型参数1 , typename 类型参数2 , …> class 类名{     //TODO: }; 类模板和函数模板都