从模板方法中检查 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