Я бы написал так:
MyClass<int> mine(2);
generic.add_options() ("myclass", po::value(&mine), "Read MyClass");
Тогда все, что нужно сделать, это определить оператор входного потока следующим образом:
std::istream& operator >>(std::istream& source, MyClass& target);
Тогда Boost Program Options вызовет этот оператор потока, когда используется опция myclass
, и ваш объект будет автоматически заполнен в соответствии с реализацией этого оператора, вместо того, чтобы позже вызывать одну из функций Program Options, чтобы извлечь значение .
Если вы не предпочитаете приведенный выше синтаксис, тоже должно работать что-то вроде:
generic.add_options() ("myclass", po::value<MyClass<int> >()->default_value(MyClass<int>(2)), "Read MyClass");
Таким образом, вы будете создавать экземпляр вашего класса напрямую с желаемым аргументом конструктора вне части шаблона, где поведение во время выполнения не разрешено. Я не предпочитаю этот способ, потому что он многословный, и вам в конечном итоге придется вызывать больше функций позже для преобразования значения.