具有条件的C ++模板非类型参数

时间:2019-07-03 11:26:14

标签: c++ templates c++17

我有非类型模板,其函数指针定义为:

template<typename T>
using CallbackFn = T (*)(T);

template <CallbackFn<float> Fn>
static void run(float * data, size_t dataLen)
{
    float dataMax = Fn(data[0]);
    for (size_t i = 1; i < dataLen; i++)
    {
        dataMax = std::max(dataMax, Fn(data[i]));
    }
    printf("%f\n", dataMax);
};

float * someData = new float[10];
run<std::sin>(someData, 10);
run<std::cos>(someData, 10);

可以做类似的事情:

template <typename T, CallbackFn<std::is_same<T, int> ? float : double> Fn>
static void run(T * data, size_t dataLen)
{
    T dataMax = Fn(data[0]);
    for (size_t i = 1; i < dataLen; i++)
    {
        dataMax = std::max(dataMax, Fn(data[i]));
    }
    printf("%f\n", dataMax);
};

int * someDataInt = new int[10];
run<int, std::sin>(someDataInt, 10);

这是一个int的愚蠢示例,但是我的实际代码更加复杂,我正在寻找是否有一种方法来处理is_same条件。

1 个答案:

答案 0 :(得分:2)

您正在寻找

CallbackFn<std::conditional_t<std::is_same_v<T, int>, float, double>>