c++ - 如何在 STL 容器和成员函数调用中存储模板化对象

标签 c++ templates stl c++11 pointer-to-member

假设你有一个类似的类

template<class T>
struct A {
  void foo() {
    // Need access to "T" here
    typedef typename someTrait<T>::someType T2;
  }
};

并且您想使用容器(可能是 STL)“注册”(或存储)类的实例(或指向它的指针),以便稍后调用 foo()所有注册实例的方法。

由于要存储使用不同模板参数实例化的实例(A<int>A<float>,...),显然不能使用 std::vector并存储实例或指向它的指针。我能想象的是制作方法 static并将函数指针存储到 void foo() ,比如:

 void static foo();

 typedef void (* fooPtr)(void);
 std::vector<fooPtr>

但不知何故,我觉得这不是很符合 C++11 风格。有没有引入包装类之类的好的解决方案?

引入基类并使用动态转换会引入对 RTTI 的依赖性, 正确的?我想避免依赖 RTTI .

在 C++11 中如何做到这一点? (我不想引入额外的依赖项,例如链接到 Boost 或依赖于 RTTI。)

感谢您的意见!

最佳答案

也许你可以只使用虚拟方法?这也适用于 C++03。

struct ABase {
    virtual void foo() = 0;
};

template<class T>
struct A : ABase {
    virtual void foo() override {
        // Access to "T" here
    }
};

...

std::vector<std::unique_ptr<ABase>> vec;
vec.emplace_back(new A<int>());
vec.emplace_back(new A<float>());

for (auto& p_a : vec)
    p_a->foo();

关于c++ - 如何在 STL 容器和成员函数调用中存储模板化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13065271/

相关文章:

c++ - 静态 Qt 链接问题 (MSVC2017)

c++ - 哪些 IDE 和文本编辑器可以推断在 C++11 中使用 auto 关键字声明的变量类型

c++ - 区间 C++ 中的数字

c++ - 如何获取集合中某个位置的整数?

C++将字符数组写入带有填充的文件

c++ - SFINAE 检查 operator[] 比我还糊涂?

c++ - 模板函数中默认参数的实例化点

c++ - 析构函数的模板特化

c++ - 使用 std::tr1::function(或 boost::function)创建多播事件

c++ - end() 在 STL 容器中是如何实现的?