C++ 函数参数的默认值,它是指向成员的指针

C++ 函数参数的默认值,它是指向成员的指针,c++,c++11,delegates,variadic-templates,member-function-pointers,C++,C++11,Delegates,Variadic Templates,Member Function Pointers,我正在尝试使用可变模板为函数实现decorator。并尽量减少重载的数量,因为这样可以在模板参数推断失败时减少编译器错误消息的大小。我有一个与任何类的任何成员一起工作的实现(与委托Ret(Ctx::*member)(Args…)一起工作),还有一个额外的重载,它不带指向成员函数的指针,只调用传递的第一个版本&Ctx::opeator()。我试图通过在这里为成员指针参数添加默认值来消除额外的重载。以下是编译的版本: template< typename Decorator,

我正在尝试使用可变模板为函数实现decorator。并尽量减少重载的数量,因为这样可以在模板参数推断失败时减少编译器错误消息的大小。我有一个与任何类的任何成员一起工作的实现(与委托Ret(Ctx::*member)(Args…)一起工作),还有一个额外的重载,它不带指向成员函数的指针,只调用传递的第一个版本&Ctx::opeator()。我试图通过在这里为成员指针参数添加默认值来消除额外的重载。以下是编译的版本:

template<
    typename Decorator,
    typename Ctx, typename R, typename... Args,
    typename... CTorArgs
>
Decorator decorate(
    CTorArgs&&...cargs,
    const Ctx &obj, R (Ctx::*member)(Args...) const = &Ctx::operator()
) {
    return Decorator(
        std::function<R(Args...)>([&obj, member](Args... args){
            return (obj.*member)(args...);
        }),
        std::forward(cargs)...
    );
}
模板<
typename装饰器,
typename Ctx,typename R,typename。。。Args,
类型名。。。克托拉格
>
装饰师装饰(
卡车&&…汽车,
const Ctx&obj,R(Ctx::*成员)(Args…)const=&Ctx::operator()
) {
返回装饰器(
std::function([&obj,member](Args…Args){
返回(obj.*成员)(args…);
}),
标准:正向(cargs)。。。
);
}
但是,如果没有明确的成员函数规范,就不能调用它。下面是我正在玩的一个例子:

struct IntDecorator {
    IntDecorator(std::function<std::string(std::string)> func): 
        m_func(func) {}

    std::string operator() (int val) {
        std::ostringstream oss;
        oss << val;
        return m_func(oss.str());
    }
private:
    std::function<std::string(std::string)> m_func;
};

struct PrefixAdder {
    PrefixAdder(std::string prefix): m_prefix(prefix) {}
    std::string addPrefix(std::string val) const {return m_prefix + val;}
    std::string operator() (std::string val) const {return m_prefix + val;}
private:
    std::string m_prefix;
};

int main(int, char**) {
    PrefixAdder p("+++> ");
    std::cout << decorate<IntDecorator>(p, &PrefixAdder::addPrefix)(123) << std::endl;
    std::cout << decorate<IntDecorator>(p, &PrefixAdder::operator())(123) << std::endl;
    std::cout << decorate<IntDecorator>(p)(123) << std::endl; // compilation error
}
struct IntDecorator{
IntDecorator(std::function func):
m_func(func){}
std::字符串运算符()(int val){
std::ostringstream oss;

oss模板参数不是从默认函数参数推导出来的。好了。我尝试使用decltype和declval为模板参数提供默认值,但无法从指向函数的指针类型中获取retval和arguments pack。额外重载是唯一的方法吗?
template<typename Decorator, typename Ctx, typename... CTorArgs>
Decorator decorate(CTorArgs&&...cargs, const Ctx &obj) {
    return decorate<Decorator>(cargs..., obj, &Ctx::operator());
}