Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11/模板:选择正确的函数重载_C++_Templates_C++11_Word Wrap_Overloading - Fatal编程技术网

C++ C++;11/模板:选择正确的函数重载

C++ C++;11/模板:选择正确的函数重载,c++,templates,c++11,word-wrap,overloading,C++,Templates,C++11,Word Wrap,Overloading,关于,这可能过于简单化了,我在这里举一个更复杂的例子。我假装的问题用以下代码描述: // test3.cpp using namespace std; template<typename T> struct exer { template<typename R, typename... rArgs, typename... pArgs> R operator()(R(T::*f)(rArgs...), pArgs&&... args)

关于,这可能过于简单化了,我在这里举一个更复杂的例子。我假装的问题用以下代码描述:

// test3.cpp

using namespace std;

template<typename T>
struct exer
{
    template<typename R, typename... rArgs, typename... pArgs>
    R operator()(R(T::*f)(rArgs...), pArgs&&... args)
    {
       return (t.*f)(forward<pArgs>(args)...);
    }

    T t;
};

struct A
{
    int addition() { return 0; }

    template<typename... Args>
    int addition(int a, Args... args) { return a + addition(args...); }
};

struct B
{
public:
    template<typename... Args>
    int addition(Args&&... args)
    {
       return m_e(&A::addition, forward<Args>(args)...);
    }

private:
    exer<A> m_e;
};

int main()
{
    B b;

    cout << b.addition(1, 2, 3, 4) << endl;
}
//test3.cpp
使用名称空间std;
模板
结构执行器
{
模板
R运算符()(R(T::*f)(rArgs…,pArgs&&…args)
{
返回(t.*f)(向前(args)…);
}
T;
};
结构A
{
int addition(){return 0;}
模板
整数加法(整数a,Args…Args){返回a+加法(Args…;}
};
结构B
{
公众:
模板
整数加法(Args&&…Args)
{
返回m_e(&A::加法,转发(args)…);
}
私人:
执行董事;
};
int main()
{
B B;

无法更改问题。如果可以使
exer
使用可调用对象而不是指向成员函数的指针,如下所示:

template<typename T>
struct exer
{
    T t;
    template<typename F, typename... pArgs>
    auto operator()(F f, pArgs&&... args)
    -> decltype(f(t, forward<pArgs>(args)...))
    {
       return f(t, forward<pArgs>(args)...);
    }

};
struct B
{
public:
    template<typename... Args>
    int addition(Args&&... args)
    {
        struct Invoker {
            auto operator()(A& a, Args&&... args) const
                ->decltype(a.addition(std::forward<Args>(args)...))
            { return a.addition(std::forward<Args>(args)...); }
        };
        return m_e(Invoker(), forward<Args>(args)...);
    }

private:
    exer<A> m_e;
};
        return m_e( [](A& a, Args&&... as) {
                      return a.addition(forward<Args>(as)...);
                    },
                    forward<Args>(args)...);