我正在使用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”以便根据此做不同的事情?
答案 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 }