2

C++ では、メンバーとフリーの両方の関数でテンプレートを作成できます。

template <void (*F) ()> void function1 ();
template <void (MyClass::*M) ()> void function2 ();

それらを明示的にインスタンス化します

function1 <&fn> ();
function2 <&MyClass::doSomething> ();

私の質問は、テンプレート引数自体がテンプレートからインスタンス化されているかどうかです

template <typename R, typename C, R (C::*M) ()> void function3 ();

どうfunction3すれば明示的にインスタンス化できますか (可能であれば)?

4

2 に答える 2

2

ただ行う:

function3<void, MyClass, &MyClass::doSomething>();

この場合の構文は、他の場合とまったく同じです。

完全なコンパイル可能な例:

#include <iostream>
class MyClass {
public:
    void doSomething() {
        std::cout << "doSomething\n";
    }
};
void fn() {
    std::cout << "fn\n";
}
template <void (*F) ()> void function1 () {
    F();
}
template <void (MyClass::*M) ()> void function2 () {
    (MyClass().*M)();
}
template <typename R, typename C, R (C::*M) ()> void function3 () {
    (C().*M)();
}
int main() {
    function1<&fn>();
    function2<&MyClass::doSomething>();
    function3<void, MyClass, &MyClass::doSomething>();
}

版画:

fn
doSomething
doSomething
于 2012-05-02T10:50:27.687 に答える
1
struct MyClass
{
        int doSomething() { return 1; }
};

template <typename R, typename C, R (C::*M) ()>
R function3(C* c) 
{
        return ( (c->*M)() );
}

int main()
{
        typedef decltype(MyClass().doSomething()) R_type;
        MyClass cls;
        function3<R_type, MyClass, &MyClass::doSomething>(&cls); // instantiation
        return 0;
}
于 2012-05-02T11:05:19.217 に答える