const和非const gsl :: span参数的函数模板特化

时间:2016-03-09 21:37:27

标签: c++ templates const

我们假设我的函数采用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<>,但随后调用变得含糊不清。

这可能吗?

1 个答案:

答案 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;
}