在类型情境

时间:2016-03-01 19:39:13

标签: c++ templates c++11 c++14 variadic-templates

我有一种情况,我需要切换一些输入标志,我想要对某些输入函数对象进行二进制比较或一元运算。例如,

template <typename Func>
void do_something(Object one, Object possibly_not_here, Func function) {
    switch(flag) {
        case 1:
            call_function_with_one_argument(one.arg);
        case 2:
            call_function_with_two_arguments(one.some_other_member, possibly_not_here.some_other_member);
    }
}

我打算将lambda传递给这个函数,该函数接受两个参数或只接受一个参数。 possibly_not_here参数可能无法传递给此函数。这将起作用,因为我传入的函数对象将被模板化,因此它将能够处理不同的类型。

有没有办法可以使用std::bind()或可变参数模板有效地实现这一目标?我无法想到一种不会重复代码的方法...

2 个答案:

答案 0 :(得分:4)

template<typename Func>
void do_something(Object one, Func &&f){
    f(one);
}

template<typename Func>
void do_something(Object one, Object two, Func &&f){
    f(one, two);
}

在你的例子中,我无法理解为什么你完全通过Func

Here's it in action.

答案 1 :(得分:0)

鉴于存在基于flag的{​​{1}}和switch,您将混合确定适当函数的运行时约束与知道是否的编译时约束函数有一两个参数。

为了满足运行时的可变性,您可能需要调查a variadic function(即flag)的使用,但我确信这不是您想要的。

对于编译时间确定,您只需使用std::invoke;

call_me(Flag flag, Func function, Object one...)

这些电话无异于;

std::invoke(func, one);
std::invoke(func, one, two);

std::forward<Func>(f)(std::forward<Object>(one)/*, std::forward<Object>(two)*/) 的基本/合适实施(如果您的平台上没有);

invoke