在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
(如果可能的话)?
答案 0 :(得分: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
答案 1 :(得分: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;
}