我有非类型模板,其函数指针定义为:
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
条件。
答案 0 :(得分:2)
您正在寻找
CallbackFn<std::conditional_t<std::is_same_v<T, int>, float, double>>