1

我有这样的课:

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_;
    }
}

有人知道吗:

  1. 具有此界面的解决方法。
  2. 其他一些解决方法,即使它使事情变得更脏,仍然允许我在get()底层对象存在时使用它。

问候

4

2 回答 2

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.

于 2014-03-28T08:04:57.417 回答
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.
};
于 2014-03-28T08:51:21.310 回答