我们假设我的函数采用settings.py
任意类型(模板化)。
gsl::span
我想创建一个模板特化/函数重载,这样当我有一个template <class T>
void foobar(gsl::span<T> x)
{
cout << "generic" << endl;
}
或gsl::span<float>
作为参数时,就会使用该函数。
gsl::span<const float>
如果可能的话,我不想为template <>
void foobar(gsl::span<float> x) // or gsl::span<const float>
{
cout << "specialization" << endl;
}
和float
编写两个专门化,但是使用相同的函数捕获它们。我的函数需要两到三个跨度,并且写入的特化量将呈指数级增长。
我也希望对double有同样的特殊化,所以我怀疑const float
是否足够精致。我曾尝试使用std::is_floating_point<>
,但随后调用变得含糊不清。
这可能吗?
答案 0 :(得分:2)
您可以使用重载和SFINAE ...
template <typename T>
std::enable_if_t<!std::is_floating_point<std::decay_t<T>>::value>
foobar(gsl::span<T> x)
{
std::cout << "generic" << std::endl;
}
template <typename T>
std::enable_if_t<std::is_floating_point<std::decay_t<T>>::value>
foobar(gsl::span<T> x)
{
std::cout << "floating point specialization" << std::endl;
}