繁体   English   中英

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

[英]Workaround for the lack of default template parameters in 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()

问候

一个简单的解决方法是编写一个仅调用模板的包装器函数。 例如:

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

以下内容可能会有所帮助:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM