可能你的结构中的成员名称和类型不同,否则没问题。
大概你需要你的结构是 POD 吗?
在这种情况下,不同的 POD 结构,主要限制是模板不能处理普通的 C++ 标识符(这是您必须为 POD 结构中的成员所拥有的)。所以你需要一个宏来定义operator<<;只有宏可以处理标识符。然后主要的问题是,如何将可变数量的参数传递给宏?
嗯,有一些方法可以传递可变数量的参数并对其进行迭代,使用 Boost 库的宏支持,但这很复杂。
无论如何,您都必须提供数据成员名称,因此它不会比您已有的代码更简洁。
记住这一点,并避免使用 Boosted 可变参数宏,它可能看起来像这样(我不会使用它,但如果你喜欢它,你也可以考虑为函数头声明定义一个宏) :
#include <iostream>
#include <string>
#define bswap_32( x ) x
#define bswap_16( x ) x
typedef unsigned uint32_t;
char const sep = '|';
template< class Type >
inline void write( Type const& v, std::ostream& stream )
{
stream << v;
}
template<>
inline void write( uint32_t const& v, std::ostream& stream )
{
stream << bswap_32( v );
}
template<>
inline void write( unsigned short const& v, std::ostream& stream )
{
stream << bswap_16( v );
}
template< class Type >
inline void write( char const legend[], Type const& v, std::ostream& stream )
{
stream << legend; write( v, stream ); stream << '|';
}
#define IMPLEMENT_OUTPUT_1( \
name1 \
) \
write( #name1 "=", r.name1, os );
#define IMPLEMENT_OUTPUT_2( \
name1, name2 \
) \
IMPLEMENT_OUTPUT_1( name1 ) \
write( #name2 "=", r.name2, os );
#define IMPLEMENT_OUTPUT_3( \
name1, name2, name3 \
) \
IMPLEMENT_OUTPUT_2( name1, name2 ) \
write( #name3 "=", r.name3, os );
#define IMPLEMENT_OUTPUT_4( \
name1, name2, name3, name4 \
) \
IMPLEMENT_OUTPUT_3( name1, name2, name3 ) \
write( #name4 "=", r.name4, os );
struct MyStruct
{
char c;
char s[10];
uint32_t i;
unsigned short us;
// friend std::ostream& operator<<( std::ostream& os, MyStruct const& r )
// {
// return os
// << "c=" << r.c << sep
// << "s=" << r.s << sep
// << "i=" << bswap_32( r.i ) << sep
// << "us=" << bswap_16( r.us ) << sep;
// }
friend std::ostream& operator<<( std::ostream& os, MyStruct const& r )
{
IMPLEMENT_OUTPUT_4( c, s, i, us )
return os;
}
};
int main()
{
using namespace std;
MyStruct const o = { 'A', "Bbbbbbb", 3, 4 };
cout << o << endl;
}
同样,我不会使用这样的方案。但是,除了 Boost'ing,对于不同的 POD 结构,它是最接近的。所以我可能值得一看。
干杯和抱歉,这可能没有帮助,