Если вы уверены, что тип To
является целочисленным или плавающим, другое возможное решение - использование диспетчеризации тегов
Используя тот факт, что std::is_integral<T>
наследуется от std::true_type
, когда T
является целочисленным типом, или от std::false_type
, в противном случае вы можете написать bar()
(используя также From
/ To
изменение порядка, предложенное songyuanyao) следующим образом
template <typename To, typename From>
To bar (From inVal)
{ return foo<To>(inVal, std::is_integral<To>{}); }
и разработать две foo()
шаблонные функции с разными сигнатурами (std::true_type
или std::false_type
для второго параметра) следующим образом
template <typename To, typename From>
To foo (From inVal, std::true_type const &)
{ std::cout << "foo() integral case: " << inVal << std::endl; return {0}; }
template <typename To, typename From>
To foo (From inVal, std::false_type const &)
{ std::cout << "foo() float case: " << inVal << std::endl; return {1}; }
Теперь звоню
bar<int>("abc");
bar<double>("xyz");
вы получите
foo() integral case: abc
foo() float case: xyz