gpt4 book ai didi

c++ - 参数化非类型模板参数?

转载 作者:行者123 更新时间:2023-11-30 04:06:28 25 4
gpt4 key购买 nike

是否可以参数化非类型模板参数?我正在尝试生成一个 thunk,它根据一些运行时检查将其参数转发给两个编译时间常量函数之一,希望得到一些类似的东西:

#include <stdlib.h>

int a(int, int, char) {
return 0;
}

int b(int, int, char) {
return 0;
}

// This doesn't work
template<typename ReturnType, typename... Params>
template<ReturnType (*first)(Params...), ReturnType (*second)(Params...)>
ReturnType coin_flip(Params... params) {
if (rand() % 2) {
return first(params...);
} else {
return second(params...);
}
}

int main() {
return coin_flip<a, b>(1, 2, '3');
}

最佳答案

有一个使用类型模板参数(通过 std::integral_constant)和宏的解决方法:

#include <type_traits>

template <typename, typename>
struct coin_flip;

template
<
typename ReturnType,
typename... Params,
ReturnType (*first)(Params...),
ReturnType (*second)(Params...)
>
struct coin_flip
<
std::integral_constant<ReturnType (*)(Params...), first>,
std::integral_constant<ReturnType (*)(Params...), second>
>
{
static
ReturnType call(Params&&... params) {
if (rand() % 2) {
return first(std::forward<Params>(params)...);
} else {
return second(std::forward<Params>(params)...);
}
}
};

#define FUNCTION_CONSTANT(f) std::integral_constant<decltype(&f), f>

#define COIN_FLIP(first, second, ...) \
coin_flip<FUNCTION_CONSTANT(first), FUNCTION_CONSTANT(second)>::call(__VA_ARGS__)

使用示例:

std::cout << COIN_FLIP(a, b, 1, 2, '3') << std::endl;

关于c++ - 参数化非类型模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22892187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com