Понятно, что функции не могут быть одновременно шаблонными и виртуальными. Но может быть очень умный шаблон проектирования, который подойдет.
Моя цель - иметь функцию, которая выглядит так:
void configure(const Configuration &config){
double stuff = config.get<double>("stuff");
int thing = config.get<int>("thing");
// rest of the code
}
В идеале я мог бы передать различные объекты конфигурации, например. объект, который читается из файла или из базы данных.
Вот (урезанный до минимума) пример конкретного класса конфигурации, использующего yaml-cpp (я думаю, понятно, даже если вы не знаете yaml-cpp):
class YAML_config : public Configuration {
public:
YAML_config(std::string file_path){
this->node = YAML::LoadFile(file_path);
}
template<typename T> T get(std::string key){
return this->node[key].as<T>();
}
private:
YAML::Node node;
Вопрос: какой код подходит для класса Configuration?
Вот неверный код, который показывает намерение:
class Configuration {
virtual template<typename T> T get(std::string key)=0;
}
Если все это просто плохое начало, какой другой подход я должен изучить? Я проверил "стирание типа", но это не помогло (или я что-то пропустил?)
boost::any
, а затем сделать функцию шаблонаget
невиртуальной и выполнить там приведение? - person TartanLlama   schedule 25.01.2017