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>();
答案 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; }
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;
};