从模板方法中检查 return 类型
check return type from templated method
我正在开发 C++11 应用程序:
我有一些模板化的方法:
template <class P, class T>
void copyMemberToDocument(const P &childClass
std::string (T::*getter) (void) const) {
auto member = (childClass.*getter)();
// ...
}
Child class 有多重继承,所以我可以有这样的东西:
class A {
public:
int getA() {return 1;}
class B {
public:
const char* getB() {return "hello";}
class C : public A, public B {};
所以我可以这样做:
C c;
copyMemberToDocument(c, &B::getB);
copyMemberToDocument(c, &A::getA);
是否可以知道模板方法中的 return 值是 "const char*" 还是 "int" 以便根据它做不同的事情?
您可以使用基本的函数重载:
void something(const char*) { /* ... */ }
void something(int) { /* ... */ }
template <class P, class T>
void copyMemberToDocument(const P &childClass
std::string (T::*getter) (void) const) {
auto member = (childClass.*getter)();
something(member);
}
正确的实现是:
template <class P, class T>
void copyMemberToDocument(const P childClass, T getter) {
static_assert(std::is_member_function_pointer<T>::value,
"getter is not a member function.");
using member_type = decltype((std::declval<P>().*getter)());
member_type member = (childClass.*getter)();
}
现在,如果您需要根据类型执行不同的代码 member_type
,您可以使用函数重载、class 特化或 c++17 的 if constexpr
。
if constexpr(std::is_same_v<int,member_type>) {
std::cout<<"I am a int member\n";
}
if constexpr(std::is_same_v<std::string,member_type>) {
std::cout<<"I am a string member\n";
}
您可能必须使用 std::remove_reference
。
我正在开发 C++11 应用程序:
我有一些模板化的方法:
template <class P, class T>
void copyMemberToDocument(const P &childClass
std::string (T::*getter) (void) const) {
auto member = (childClass.*getter)();
// ...
}
Child class 有多重继承,所以我可以有这样的东西:
class A {
public:
int getA() {return 1;}
class B {
public:
const char* getB() {return "hello";}
class C : public A, public B {};
所以我可以这样做:
C c;
copyMemberToDocument(c, &B::getB);
copyMemberToDocument(c, &A::getA);
是否可以知道模板方法中的 return 值是 "const char*" 还是 "int" 以便根据它做不同的事情?
您可以使用基本的函数重载:
void something(const char*) { /* ... */ }
void something(int) { /* ... */ }
template <class P, class T>
void copyMemberToDocument(const P &childClass
std::string (T::*getter) (void) const) {
auto member = (childClass.*getter)();
something(member);
}
正确的实现是:
template <class P, class T>
void copyMemberToDocument(const P childClass, T getter) {
static_assert(std::is_member_function_pointer<T>::value,
"getter is not a member function.");
using member_type = decltype((std::declval<P>().*getter)());
member_type member = (childClass.*getter)();
}
现在,如果您需要根据类型执行不同的代码 member_type
,您可以使用函数重载、class 特化或 c++17 的 if constexpr
。
if constexpr(std::is_same_v<int,member_type>) {
std::cout<<"I am a int member\n";
}
if constexpr(std::is_same_v<std::string,member_type>) {
std::cout<<"I am a string member\n";
}
您可能必须使用 std::remove_reference
。