Как человек, довольно редко использующий шаблоны и метаопрограммирование, периодически путаюсь них. Недавно был сильно озадачен, пытаясь написать оператор << для шаблонного класса. Хотелось получить поддержку следующего синтаксиса:
Buffer<int> buff;
int data1 = 100;
int data2 = 200;
buff << data1 << data2;
Казалось бы ничего сложного (да и без казалось ничего сложного), тем не менее пришлось подумать. Основная проблема – синтаксис который позволял использовать компилятор из вендовой студии не сработал:
template<typename T>
class Buffer
{
public:
friend Buffer<T>& operator<< ( Buffer<T> buff, const T& data );
Buffer()
{}
~Buffer()
{}
};
template<typename T>
Buffer<T>& operator<<( Buffer<T>& buff, const T& data )
{
// do smth
return buff;
}
Погуглив, я понял, что эта проблема волнует не только меня, но врет решения предлагались несколько кривоваты, например можно сделать так:
template<typename U>
friend Buffer& operator<< ( Buffer& buff, const U& data );
Но это не то что требуется. Хотя на самом деле, все просто и логично:
template<typename T>
class Buffer;
template<typename T>
Buffer<T>& operator<<( Buffer<T>& buff, const T& data );
template<typename T>
class Buffer
{
public:
friend Buffer<T>& operator<< <T> ( Buffer<T>& buff, const T& data );
Buffer()
{}
~Buffer()
{}
};
template<typename T>
Buffer<T>& operator<<( Buffer<T>& buff, const T& data )
{
// do smth
return buff;
}