检查模板化方法的返回类型

时间:2018-06-28 15:20:02

标签: c++ c++11 templates return-type-deduction

我正在使用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 :(得分:1)

正确的实现是:

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

答案 1 :(得分:0)

您可以使用基本的函数重载

override func viewWillAppear(_ animated: Bool) {
        self.navigationController?.navigationBar.isHidden = false }