我有一个在运行时对动态数据(many_things)起作用的函数:
void do_some_work(Thing &many_things)
{
constexpr bool add = something_evald_at_compile_time;
// do some work
for(auto &thing : many_things) {
thing.result = add_or_subtract(thing.one,thing.two);
}
}
我希望有两种变体" add_or_subtract'并根据constexpr调用其中一个'添加':
template <typename N> // call me if 'add' == true
N add_or_subtract(N a, N b) { return a+b; }
template <typename N> // call me if 'add' == false
N add_or_subtract(N a, N b) { return a-b; }
我该怎么做?
答案 0 :(得分:3)
创建帮助器类型。
tempate <bool val=true> struct is_add {};
tempate <> struct is_add<false> {};
使用辅助类型来区分加减法。
template <typename N> // call me if 'add' == true
N add_or_subtract(N a, N b, is_add<true>) { return a+b; }
template <typename N> // call me if 'add' == false
N add_or_subtract(N a, N b, is_add<false>) { return a-b; }
用法:
void do_some_work(Thing &many_things)
{
constexpr bool add = something_evald_at_compile_time;
// do some work
for(auto &thing : many_things) {
thing.result = add_or_subtract(thing.one,thing.two, is_add<add>());
}
}
答案 1 :(得分:2)
只需对编译时计算表达式使用条件:
template <typename N> // call me if 'add' == true
N add(N a, N b) { return a+b; }
template <typename N> // call me if 'add' == false
N subtract(N a, N b) { return a-b; }
void do_some_work(Thing &many_things)
{
constexpr bool do_add = something_evald_at_compile_time;
// do some work
for(auto &thing : many_things)
thing.result = (do_add ? add : subtract)(thing.one,thing.two);
}