使用 C++11 的泛型 getter
Generic getter with C++11
我想尝试使用 C++11 来实现泛型 getter,但是如果我尝试在模板 class 之外定义泛型 getter,就会遇到问题.
这段代码工作正常
template <typename T>
class test
{
public:
........
//generic getter
template <typename F>
auto getter_elem_member(F fun)->decltype(fun())
{ return elem.fun(); }
private
T elem;
};
但如果我以这种方式尝试代码:
template <typename T>
class test
{
public:
........
//generic getter
template <typename F>
auto getter_elem_member(F fun)->decltype(fun());
private
T elem;
};
template <typename T>
template <typename F>
auto test<T>::getter_elem_member(F fun)->decltype(fun())
{ return elem.fun(); }
我收到错误 "Member declaration not found"。
我哪里错了?
提前感谢您的任何建议
我正在使用新功能进行练习,这里是一个有效的示例(除非有警告)
#include <iostream>
#include <string>
template <typename T>
class test
{
public:
//costruttori - distruttori
test(){}
~test(){}
public:
//generic getter
template <typename F>
auto getter_elem_member(F fun)
{ return (elem.*fun)(); }
//generic getter
template <typename F>
auto getter_elem_member2(F fun)->decltype(fun())
{ return fun(); }
private:
T elem;
};
struct A
{
std::string print(){return "ciao";}
static std::string print2(){return "ciao";}
};
int main()
{
test<A> test1;
std::cout << test1.getter_elem_member(&A::print) << std::endl;
std::cout << test1.getter_elem_member2(A::print2) << std::endl;
}
您似乎正在尝试使用类似模板函数的范例。
您应该使用 std::function 来执行此操作。如果没有,您可能可以使用某种模板化函数指针来执行此操作。
如果你想做一个通过成员函数指针调用私有成员变量的成员函数的代理函数,我认为你根本不需要decltype
。
// Member function pointer version
template <class Ret>
Ret getter_elem_member(Ret (T::*fun)())
{ return (elem.*fun)(); }
// Generic function object version
template <class F>
auto getter_elem_member(F fun) -> decltype(fun())
{ return fun(); }
如果给出函数指针,将调用第一个。对于其他可调用类型,将调用第二个。
第二个用于通用可调用对象,似乎没有必要。由于无论如何您都无法访问 fun
中的私有成员,因此最好在外部调用 fun()
而不是传递它并让您的 class 调用它。
我想尝试使用 C++11 来实现泛型 getter,但是如果我尝试在模板 class 之外定义泛型 getter,就会遇到问题.
这段代码工作正常
template <typename T>
class test
{
public:
........
//generic getter
template <typename F>
auto getter_elem_member(F fun)->decltype(fun())
{ return elem.fun(); }
private
T elem;
};
但如果我以这种方式尝试代码:
template <typename T>
class test
{
public:
........
//generic getter
template <typename F>
auto getter_elem_member(F fun)->decltype(fun());
private
T elem;
};
template <typename T>
template <typename F>
auto test<T>::getter_elem_member(F fun)->decltype(fun())
{ return elem.fun(); }
我收到错误 "Member declaration not found"。 我哪里错了?
提前感谢您的任何建议
我正在使用新功能进行练习,这里是一个有效的示例(除非有警告)
#include <iostream>
#include <string>
template <typename T>
class test
{
public:
//costruttori - distruttori
test(){}
~test(){}
public:
//generic getter
template <typename F>
auto getter_elem_member(F fun)
{ return (elem.*fun)(); }
//generic getter
template <typename F>
auto getter_elem_member2(F fun)->decltype(fun())
{ return fun(); }
private:
T elem;
};
struct A
{
std::string print(){return "ciao";}
static std::string print2(){return "ciao";}
};
int main()
{
test<A> test1;
std::cout << test1.getter_elem_member(&A::print) << std::endl;
std::cout << test1.getter_elem_member2(A::print2) << std::endl;
}
您似乎正在尝试使用类似模板函数的范例。 您应该使用 std::function 来执行此操作。如果没有,您可能可以使用某种模板化函数指针来执行此操作。
如果你想做一个通过成员函数指针调用私有成员变量的成员函数的代理函数,我认为你根本不需要decltype
。
// Member function pointer version
template <class Ret>
Ret getter_elem_member(Ret (T::*fun)())
{ return (elem.*fun)(); }
// Generic function object version
template <class F>
auto getter_elem_member(F fun) -> decltype(fun())
{ return fun(); }
如果给出函数指针,将调用第一个。对于其他可调用类型,将调用第二个。
第二个用于通用可调用对象,似乎没有必要。由于无论如何您都无法访问 fun
中的私有成员,因此最好在外部调用 fun()
而不是传递它并让您的 class 调用它。