复杂的C ++ 11模板专业化代码:它可以用更简单的方式编写吗?

时间:2017-07-07 18:10:50

标签: c++11 template-specialization

我正在使用C ++ 11开发一个有点通用的管道框架。 为此,我定义了:

  • 带引用计数的DataBuffer类。
  • 一个Producer类,它接受某个输入类型“IN”并生成某个输出类型“OUT”

我想确保框架透明地更新DataBuffer引用计数,以便程序员不需要处理它。 这就是我想出来的(显然很好):

template <class T>
class DataBuffer
{
  public:
    void   Acquire() {}
    void   Release() {}
};

template<typename T>
struct is_databuffer_ptr { static constexpr bool value = false; };
template<typename T>
struct is_databuffer_ptr<DataBuffer<T>* > { static constexpr bool value = true; };

template<typename T>
struct is_databuffer_ref { static constexpr bool value = false; };
template<typename T>
struct is_databuffer_ref<DataBuffer<T>& > { static constexpr bool value = true; };

template<typename T>
struct is_databuffer { static constexpr bool value = false; };
template<typename T>
struct is_databuffer<DataBuffer<T> > { static constexpr bool value = true; };

template <class IN, class OUT>
class Producer
{
  public:
    template< typename T=OUT
            , typename std::enable_if<  !is_databuffer_ptr<T>::value
                                     && !is_databuffer_ref<T>::value
                                     && !is_databuffer<T>::value    >::type* = nullptr>
    void  Produce(const OUT& result)
    { std::cout << "produce (default)\n"; }

    template< typename T=OUT
            , typename std::enable_if<is_databuffer_ptr<T>::value>::type* = nullptr>
    void  Produce(OUT databuf)
    {
      std::cout << "produce (databuf ptr)\n";
      databuf->Release();
    }

    template< typename T=OUT
            , typename std::enable_if<  is_databuffer_ref<T>::value
                                     || is_databuffer<T>::value    >::type* = nullptr>
    void  Produce(OUT& databuf)
    {
      std::cout << "produce (databuf ref)\n";
      databuf.Release();
    }
};

现在我正在查看代码并发现它很复杂。

这是我的问题:有没有更简单的方法在C ++ 11中编写它?

0 个答案:

没有答案