2

Configuration オブジェクトを定義する必要があります。Impl に使用していますが、インターフェイスで Impl の詳細を公開したり、インターフェイスでファイルをブーストしboost::property_treeたりしたくありません。#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;
 }

1つのオプションは、「取得」できるタイプを制限することです。たとえば、次のようになります。

// 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;
 }

しかし、これはかなり醜く、スケーラブルではありません。
より良いオプションはありますか?

4

2 に答える 2