我有一个这样的课程:
template <class Object = NullObject>
class MyClass : OptimizedStorage<Object> {
...
public:
//Cannot do this in Visual studio 2012
template <class Object2 = Object,
class = enable_if<!is_same<Object2, NullObject>::value>>
Object & get() const {
return this->object_;
}
}
有谁知道:
get()
我的基础对象存在。此致
答案 0 :(得分:1)
一个简单的解决方法是编写一个只调用模板的包装函数。例如:
private:
template<typename ENABLER>
Object& get_()
{
return this->object_;
}
template<typename Object2>
Object& get_()
{
return get_<typename std::enable_if<!std::is_same<Object2,NullObject>::value>::type>();
}
public:
//Overload for default Object template parameter:
Object& get()
{
return get_<Object>();
}
当然编译器可以内联所有包装,因此这里的性能不是问题。
请注意,我添加了const
限定符:您将返回对内部数据的引用,getter不能/不应该是const
。
答案 1 :(得分:0)
以下可能会有所帮助:
template <class Object = NullObject>
class MyClass {
Object object_;
template <class T>
typename std::enable_if<!std::is_same<T, NullObject>::value, Object &>::type
get_() { return this->object_; }
public:
Object& get() { return get_<Object>(); }
};
或者你可以专门化你的结构(可能需要一些复制/粘贴:/):
template <class Object = NullObject>
class MyClass {
Object object_;
public:
Object& get() { return this->object_; }
};
template <>
class MyClass<NullObject> {
public:
// No get function.
};