Шаблонный тип C ++ с условием - PullRequest
1 голос
/ 03 июля 2019

У меня нетипичный шаблон с указателем функции, определенным как:

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 Ответ

2 голосов
/ 03 июля 2019

Вы ищете

CallbackFn<std::conditional_t<std::is_same_v<T, int>, float, double>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...