Подход constexpr if хорош, но я хотел бы добавить еще одно решение, которое я считаю предпочтительным, если у вас много вызовов SomeFunc
в вашей кодовой базе.
Еще одно преимущество моего решения заключается в том, что он лучше масштабируется, если у вас много типов или вам нужно иметь возможность добавлять типы позже, потому что logi c сопоставления инкапсулирован в специализации шаблона, а не в вызывающем коде.
Я предполагаю, что вы С точки зрения семантики хотеть - это что-то вроде скалярного типа T
:
template<typename T>
struct scalar_type {
using type = T;
};
template<typename T>
using scalar_t = typename scalar_type<T>::type;
Теперь вы можете добавить отдельные характеристики этого шаблона для всех типов векторов, матриц или всего, что вам нужно.
template<>
struct scalar_type<Vector3d> {
using type = double;
};
Ваш код вызова будет выглядеть так:
template<typename T>
auto SumCoefficients(const std::vector<T>& coeffs) {
scalar_t<T> sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<scalar_t<T>>(i) * coeffs[i];
}
return sum;
}
Если вы ограничены c ++ 11, сайт вызова может выглядеть так:
template<typename T, typename Scalar = scalar_t<T>>
Scalar SumCoefficients(const std::vector<T>& coeffs) {
Scalar sum;
for(int i=0; i<100; ++i) {
sum += SomeFunc<Scalar>(i) * coeffs[i];
}
return sum;
}
См. Полный пример здесь