c++ - 有什么方法可以在抽象基类中使用模板函数?

标签 c++ virtual abstract-class

我正在尝试制作一个配置管理器类,它可以通过 std::string 存储任意对象。

我对我的接口(interface)(抽象基类)的最初想法是这样的(当然这是非常不完整的)

class ConfigurationManager
{
public:
   static boost::shared_ptr<ConfigurationManager> create();

   template<typename T>
   virtual T getOption(const std::string& name) = 0;
};

但后来我的编译器指出模板不能是虚拟的(然后我意识到无论如何我都不能导出模板)。

我将在内部使用 boost::any(几乎是运行时检查无效*),但我不想在我的界面中公开 boost::any。

解决此问题的最佳方法是什么?

最佳答案

创建一个返回 boost::any 的 protected 虚拟抽象函数,以及一个非虚拟的、非抽象的公共(public)模板函数,以对您的界面用户隐藏它。

class ConfigurationManager {
protected:
    virtual boost::any getOptionProtected(const std::string& name) = 0;
public:
    static boost::shared_ptr<ConfigurationManager> create();
    template<typename T> T getOption(const std::string& name) {
        return boost::any_cast<T>(getOptionProtected(name));
    }
};

关于c++ - 有什么方法可以在抽象基类中使用模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8611318/

相关文章:

c++ - 为什么多态性在没有指针/引用的情况下不起作用?

c++ - 为什么虚拟继承 2 个类会增加对象大小?

c++ - 在 C++ 中安全地传递对抽象类的引用

c# - 具有公共(public)getter的抽象属性,可以在具体类中定义私有(private)setter吗?

c++ - 5 检查的倍数

c++ - 在 C++ 中以通用的可移植方式识别类型

c++ - 使用 ATOMIC_FLAG_INIT 和 std::atomic_flag::clear 有什么区别

c++ - 是否存在乐观的无锁 FIFO 队列实现?

c++ - 删除这个并放置新的虚拟派生类

c++ - 从抽象(纯虚拟)类私有(private)继承是否有意义?