Visual C ++ 2012中缺少默认模板参数的解决方法

时间:2014-03-28 07:10:46

标签: c++ c++11 visual-c++-2012

我有一个这样的课程:

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()我的基础对象存在。
  3. 此致

2 个答案:

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