Я работаю на микс-моноблока класса Config Читателя, который поддерживает чтение данных конфигурации из среды, командной строки, файлы и т.д ..C++ VARIADIC шаблон класса дизайн
Я был вид после зЬй :: Тип кортежа дизайн:
template <class... Ts> struct ConfigReader {};
template <class T, class... Ts>
class ConfigReader<T, Ts...> : ConfigReader<Ts...>
{
public:
typedef boost::fusion::set<T, Ts...> sequence_type;
ConfigReader(T t, Ts... ts)
: ConfigReader<Ts...>(ts...)
, parameters_(t, ts...)
{
this->init();
}
private:
sequence_type parameters_;
void init()
{
boost::fusion::for_each(parameters_, SetFromEnvironment());
boost::fusion::for_each(parameters_, SetFromCommandLine());
boost::fusion::for_each(parameters_, SetFromConfigFile());
}
};
Но я понял, что я мог бы определить это без рекурсивного наследования
template <class T, class... Ts>
class ConfigReader<T, Ts...>
{
public:
typedef boost::fusion::set<T, Ts...> sequence_type;
ConfigReader(T t, Ts... ts)
: parameters_(t, ts...)
{
this->init();
}
template <class Type>
typename boost::fusion::result_of::value_at_key<Sequence const, Type>::type get()
{
return boost::fusion::at_key<Type>(parameters);
}
private:
sequence_type parameters_;
void init()
{
boost::fusion::for_each(parameters_, SetFromEnvironment());
boost::fusion::for_each(parameters_, SetFromCommandLine());
boost::fusion::for_each(parameters_, SetFromConfigFile());
}
};
в последнем случае, кажется, работает лучше, потому что Init() только калла d один раз, который действительно то, что я хочу. Но теперь я смущен относительно того, какие различия между ними? Я что-то теряю без рекурсивного наследования?
Упрощенный использование будет .. (Игнорирование структур типа параметра)
int main()
{
ConfigReader<Start, End, Resources> configReader(Start(), End("infinity"), Resources());
Start startTime = configReader.get<Start>();
}
Непонятно, что вы делаете. В частности, есть ли причина, по которой вы не просто используете 'std :: tuple'? Что такое 'init()' и где он определен? – Barry
Я добавил еще немного информации. Но действительно ли это влияет на ответ на вопрос о том, какая разница между рекурсивным наследованием и нет? – mike