我正在使用C ++ 11开发一个有点通用的管道框架。 为此,我定义了:
我想确保框架透明地更新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中编写它?