проверить тип возвращаемого значения из шаблонного метода - PullRequest
0 голосов
/ 28 июня 2018

Я работаю над приложением c ++ 11:

Там у меня есть несколько шаблонных методов:

template <class P, class T>
void copyMemberToDocument(const P &childClass
                          std::string (T::*getter) (void) const) {
   auto member = (childClass.*getter)();
   // ...
}

Дочерний класс имеет множественное наследование, поэтому у меня может быть что-то вроде:

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);

Можно ли узнать, будет ли возвращаемое значение в шаблонном методе "const char *" или "int", чтобы делать разные вещи в зависимости от этого?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Правильная реализация:

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, вы можете использовать перегрузку функции, специализацию класса или 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.

0 голосов
/ 28 июня 2018

Вы можете использовать базовую функцию перегрузки :

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...