我对模板类的可能性很感兴趣。现在,我想知道如何实现以下目标:
Const<5>::getValue();
目前我可以这样做:
Const<int, 5>::getValue());
这就是班级的实施:
template <typename T, T value>
class Const {
public:
typedef T Type;
static T getValue() {
return value;
}
};
我知道这只是一个非常愚蠢的例子,但是一旦我能做到这一点,我可以简化以下行:
Getter<int, TestClass, &TestClass::get> getter;
只是:
Getter<&TestClass::get> getter;
那将是TestClass:
class TestClass {
private:
int _value;
public:
int get() {
return _value;
}
};
感谢您的帮助!
[EDIT-1]
关于J.N.是的,C ++ 11没问题。
关于Xeo,我尝试使用#define AUTO_ARG(x) decltype(x), x
,但这在TestClass中不起作用。
[EDIT-2]
关于KennyTM,当我在TestClass中声明Getter<...> g
时,它不适用于Getter<AUTO_ARG(&TestClass::get)>
,它仅适用于Getter<int (TestClass::*)() const, &TestClass::get>
。
现在我想知道这只是Visual Studio中的一个错误???
答案 0 :(得分:2)
您仍然可以使用@Xeo's link给出的AUTO_ARG(x)
。如果需要获取返回类型或类类型,只需使用模式匹配(即模板特化):
template <typename T, T mem_fun_ptr>
struct Getter;
template <typename R, typename C, typename... A, R (C::*mem_fun_ptr)(A...) const>
struct Getter<R (C::*)(A...) const, mem_fun_ptr>
{
typedef R return_type;
typedef C class_type;
};
#define AUTO_ARG(x) decltype(x),(x)
class TestClass {
private:
int _value;
public:
int get() const {
return _value;
}
};
Getter<AUTO_ARG(&TestClass::get)> g;