如何根据constexpr结果在编译时选择函数

时间:2014-11-29 06:00:17

标签: c++ c++11

我有一个在运行时对动态数据(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; }

我该怎么做?

2 个答案:

答案 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);
}