C ++模板#if和typeid来获取对象

时间:2017-11-08 06:28:20

标签: c++ oop c++11 templates

class holder
{
public:
     template<class T>
     T get()
     {
        #if (typeid(T) == typeid(object1)){
          return obj1;
        }
        #elif (typeid(T) == typeid(object2)){
          return obj2;
        }
       // #else{
          // return nullptr; // sory my mistake. ignore it.
       // }
       #endif
    }

private:
    object1 obj1;
    object2 obj2;
}

想通过模板获取一个对象,但是,它不起作用。为什么以及如何修改它。 我知道 像这样使用它:

holder a;
object1 obj1 = a.get<object1>();

1 个答案:

答案 0 :(得分:4)

将宏与模板一起使用并不是一个好主意。您可以使用full template specialization。 e.g。

class holder
{
public:
     template<class T>
     T get() {
         return {};
     }
private:
    object1 obj1;
    object2 obj2;
};

template<>
object1 holder::get<object1>() { return obj1; }
template<>
object2 holder::get<object2>() { return obj2; }

LIVE

BTW:get按值返回,所以我认为返回nullptr无法正常工作。在主模板中,我返回了一个值初始化的对象。如果不应该调用它,你可以将其标记为delete,如@StoryTeller建议的那样;然后你会在编译时遇到错误。

从C ++ 17开始,你可以使用if constexpr,这可能更接近你原来的想法。

class holder
{
public:
     template<class T>
     T get() {
         if constexpr (std::is_same_v<T, object1>) 
             return obj1;
         else if constexpr (std::is_same_v<T, object2>) 
             return obj2;
         else
             return {};
     }
private:
    object1 obj1;
    object2 obj2;
};

LIVE