我需要定义一个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;
}
但这很丑陋且不具备可扩展性 还有更好的选择吗?
答案 0 :(得分:2)
答案 1 :(得分:0)
你必须使用模板和类型擦除来实现这一点,观看这个名为的cppcon视频:实用类型擦除。 (https://www.youtube.com/watch?v=5PZVuUzP34g)