Я использовал ответ на вопрос SO "итерация по кортежу" , чтобы написать метод для перегрузки . Этот метод был протестирован и работает правильно с
g ++ 4.7
в сжатии Debian.
Однако этот метод является своего рода обходным путём, поскольку кажется, что не может быть явно создан (я нашел сообщение об этом
здесь ). Итак, нужно определить строковый метод, а затем вызвать его. У меня есть аналогичный метод для вектора, более прямой. Есть ли у кого-нибудь предложения о том, как избавиться от лишнего шага по созданию строкового метода, используя тот же подход или иным образом? Заранее спасибо.
#include
#include
#include
#include
#include
using std::ostream;
using std::cout;
using std::endl;
using std::vector;
using std::string;
// Print vector.
template ostream& operator <<(ostream& out, const vector & vec)
{
unsigned int i;
out << "[";
for(i=0; i
inline typename std::enable_if::type
stringval(const std::tuple & t)
{
std::stringstream buffer;
buffer << "]";
return buffer.str();
}
template
inline typename std::enable_if::type
stringval(const std::tuple & t)
{
std::stringstream buffer;
size_t len = sizeof...(Tp);
if(I==0)
buffer << "[";
buffer << std::get(t);
if(I < len - 1)
buffer << ", ";
buffer << stringval(t);
return buffer.str();
}
template ostream& operator <<(ostream& out, const std::tuple & t)
{
out << stringval(t);
return out;
}
int
main()
{
typedef std::tuple T;
std::tuple t = std::make_tuple(2, 3.14159F, 2345.678);
cout << t << endl;
}
При компиляции это дает
[2, 3.14159, 2345.68]