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;
}
しかし、これはかなり醜く、スケーラブルではありません。
より良いオプションはありますか?