gpt4 book ai didi

c++ - 使用 is_integral/BOOST_STATIC_ASSERT 限制模板实例化

转载 作者:行者123 更新时间:2023-11-30 00:41:21 27 4
gpt4 key购买 nike

我正在尝试实现一个自由​​运算符函数,以便将任意数据类型的值流式传输到某个容器类 (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 <<(BasisKlassen::DataVector &,T)' 和 [ T=整数 ]

最佳答案

我不是 boost 方面的专家, 但从外观上看 BOOST_STATIC_ASSERT(0)即使 boost::is_integral<T>::value 也会编译返回 true(类似于所有其他正常函数)。因此你会得到编译器错误(当静态断言的条件返回 false 时是预期的)。要解决此问题,最简单的方法是将函数更改为类似以下内容:

template<typename T>
DataVector& operator <<(DataVector& vecArchive, T dataToAppend)
{
BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
// ... do something
return vecArchive;

};

关于c++ - 使用 is_integral/BOOST_STATIC_ASSERT 限制模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3811540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com