c – 为给定的参数类型推导选定的重载函数类型

在给定重载集和参数列表的情况下,是否可以确定重载决策将选择的候选函数类型?例如,给定:

char* f(int);
int f(char*);

我希望能够写出类似的东西:

overload<f, short>::type x;

声明char *(*)(int)类型的变量x.

这可能吗?我的第一直觉是写下这样的东西:

template<typename... Args>
struct overload {
    template<typename Ret>
    static auto deduce(Ret (*fptr)(Args...)) -> decltype(fptr);
};

…但是这不能处理非完全匹配(即decltype(overload< int> :: deduce(f))有效,但是decltype(重载< short> :: deduce(f))不能).

C 14救援的一般羔羊:

#define wap_function(f) \
   [](auto&&... args){ return f(std::forward<decltype(args)>(args)...); }

请注意,此gem还解决了第一类函数模板的问题:

template<typename Lhs, typename Rhs>
auto add(const Lhs& lhs, const Rhs& rhs)
{
    return lhs + rhs;
}

std::accumulate(std::begin(array), std::end(array), 0, wrap_function(add));
相关文章
相关标签/搜索