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++中,允许在函数上创建一个模板,包括成员和自由< /p> template <void (*F) ()> void function1 (); template <void (MyClass::*M) ()> void function2 (); 模板无效函数1(); 模板void函数2();_C++_Templates - Fatal编程技术网

在模板化函数上参数化的函数模板的显式实例化 在C++中,允许在函数上创建一个模板,包括成员和自由< /p> template <void (*F) ()> void function1 (); template <void (MyClass::*M) ()> void function2 (); 模板无效函数1(); 模板void函数2();

在模板化函数上参数化的函数模板的显式实例化 在C++中,允许在函数上创建一个模板,包括成员和自由< /p> template <void (*F) ()> void function1 (); template <void (MyClass::*M) ()> void function2 (); 模板无效函数1(); 模板void函数2();,c++,templates,C++,Templates,并显式地实例化它们 function1 <&fn> (); function2 <&MyClass::doSomething> (); function1(); 功能2(); 我的问题是,如果模板参数本身是从模板实例化的 template <typename R, typename C, R (C::*M) ()> void function3 (); 模板无效函数3(); 如何显式地实例化函数3(如果可能的话)?只需执行以下操作: f

并显式地实例化它们

function1 <&fn> ();
function2 <&MyClass::doSomething> ();
function1();
功能2();
我的问题是,如果模板参数本身是从模板实例化的

template <typename R, typename C, R (C::*M) ()> void function3 ();
模板无效函数3();
如何显式地实例化
函数3
(如果可能的话)?

只需执行以下操作:

function3<void, MyClass, &MyClass::doSomething>();
struct MyClass
{
int doSomething(){return 1;}
};
模板
R功能3(C*C)
{
回报率((c->*M)();
}
int main()
{
typedef decltype(MyClass().doSomething())ru类型;
MyClass cls;
function3(&cls);//实例化
返回0;
}

您是指模板参数吗?你需要实例化模板参数并传递一个实例化的类型。对,我不敢相信我错过了。我有一种印象,既然
R
C
已经包含在
M
类型中,那么我可以省略它们。谢谢
#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
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;
}