2015-11-22 3 views
0

У меня есть функция, которая считывает параметры различных типов из файла, и я хотел бы предоставить параметры по умолчанию. Использование простого аргумента функции по умолчанию не является хорошим решением, потому что невозможно отличить функцию от того, был ли задан аргумент или использовался ли по умолчанию. Поэтому я думал, что буду использовать boost::optional. У меня есть функция, которая выглядит примерно так:Использование boost :: необязательных аргументов в качестве параметров в функциях шаблона

template <typename T> 
void func(T& out, boost::optional<T> def_val) { 
// do stuff 
} 

но это не подходит для вывода типа, например.

double x; 
func(x, 3.0); // error: could not match optional against double 
func(x, boost::optional<double>(3.0)); // ok but way too verbose 
func<double>(x,3.0); // ok and better but still not ideal 

, который удивляет меня, я думал, что первый параметр out будет достаточно для того, чтобы компилятор выводить T = double и разобрать второй аргумент правильно. Есть ли способ сделать это красиво?

ответ

0

Шаблоны имеют точное соответствие для вывода типа. В вашем примере int и double - две возможности для T, поэтому компилятор дает вам ошибку. В других частях языка компилятор попытается найти общий тип (для int и double, это double), но не для вывода типа шаблона.

Вы можете предотвратить второй аргумент от участия в типе дедукции с простой оберткой, где это невозможно вообще для компилятора вывести тип из него:

template<typename T> 
struct id {typedef T type;}; 

template <typename T> 
void func(T& out, boost::optional<typename id<T>::type> def_val) { 
// do stuff 
} 

Вы можете увидеть эту компиляцию и вывести double для There. Обратите внимание, что ссылка не связана просто потому, что я удалил определение func, чтобы в этом примере отобразился выведенный тип.

Смежные вопросы