与模板方法的接口

时间:2012-09-06 07:27:49

标签: c++ oop boost interface

我需要定义一个Configuration对象。我正在使用boost::property_tree作为impl,但我不想在我的界面中公开Impl细节,或者必须在我的界面中#include增强文件。 问题是我想使用ptree的模板方法来获取值,

template <typename T>
T get(const std::string key)

但这是不可能的(?)

// Non compilable code (!)
// Interface
class Config {
public:
   template <typename T>
   T get(const std::string& key);
 }

 // Impl
 #include "boost/property_tree.h"

class ConfigImpl : public Config {
public:
   template <typename T>
   T get(const std::string& key) {
      return m_ptree.get(key);
   }

 private:
   boost::ptree m_ptree;
 }

一种选择是限制我可以“获取”的类型,例如:

// Interface
class Config {
public:
   virtual int get(const std::string& key) = 0;
   virtual const char* get(const std::string& key) = 0;
 }

 // Impl
 #include "boost/property_tree.h"

class ConfigImpl : public Config {
public:
   virtual int get(const std::string& key) { return m_ptree.get<int>(key) };
   virtual const char* get(const std::string& key) { return m_ptree.get<const char*>(key); }

 private:
   boost::ptree m_ptree;
 }

但这很丑陋且不具备可扩展性 还有更好的选择吗?

2 个答案:

答案 0 :(得分:2)

你不能拥有虚拟功能模板 - 但你可以使用另一种接口技术,这就是所谓的Pimpl习惯用法。

请参阅herehere

答案 1 :(得分:0)

你必须使用模板和类型擦除来实现这一点,观看这个名为的cppcon视频:实用类型擦除。 (https://www.youtube.com/watch?v=5PZVuUzP34g