【发布时间】:2010-09-28 09:47:55
【问题描述】:
我正在尝试实现一个免费的运算符函数,以便将任意数据类型的值流式传输到某个容器类 (DataVector)。
我为项目中使用的基本数据类型和复杂数据类型做了一个模板(示例仅涵盖 std::string)。
为了确保模板不会与基本实现未正确处理的数据类型一起使用,我想使用类型特征(is_integral)限制实例化。多次尝试将 is_enabled is_integral 嵌入到运算符的签名中都失败了,我最终得到了下面示例中所示的实现。
typedef std::vector<unsigned char> DataVector;
template<typename T>
DataVector& operator <<(DataVector& vecArchive, T dataToAppend)
{
if (boost::is_integral<T>::value == true)
{
// ... do something
return vecArchive;
}
BOOST_STATIC_ASSERT(false);
};
template<> inline
DataVector& operator << <string> (DataVector& vecArchive, string dataToAppend)
{
// do something different
return vecArchive;
};
问题是它无法编译,即使是整数数据类型。我猜 BOOST_STATIC_ASSERT 不能在条件表达式中使用。如何做呢?任何帮助将不胜感激。
main()
{
DataVector vecTel;
vecTel << (int)5; // ok
vecTel << std::string("Hello World"); // ok
vecTel << std::map(int, int) // must fail
}
编译器错误:
d:...\TcpSerializable.h(52) : 错误 C2027: 使用未定义类型 'boost::STATIC_ASSERTION_FAILURE' 和 [ x=假 ] .\Telegram050.cpp(38) : 请参阅正在编译的函数模板实例化 'BasisKlassen::DataVector &BasisKlassen::operator
【问题讨论】: