作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在单独的文件中使用模板助手和额外的专门重载以便包含顺序无关的正确方法是什么?
在类似我的情况下,是否有正确的处理方法(见下文描述)?
免责声明:我不确定描述是否措辞恰当。请随时帮助更好地表达它。
我正在使用的代码依赖于使用 boost::variant
的 std::vector
来存储一些基元的属性。示例:
BOOST_STRONG_TYPEDEF(std::string, PointName)
BOOST_STRONG_TYPEDEF(double, CoordinateX)
BOOST_STRONG_TYPEDEF(double, CoordinateY)
typedef boost::variant<PointName, CoordinateX, CoordinateY> PointAttribute;
typedef std::vector<PointAttribute> PointAttributes;
BOOST_STRONG_TYPEDEF(std::string, LineName)
BOOST_STRONG_TYPEDEF(double, LineLength)
typedef boost::variant<LineName, LineLength> LineAttribute;
typedef std::vector<LineAttribute> LineAttributes;
我正在编写一个帮助程序,用于添加头文件 VariantHelper.h
中包含的新属性:
template <typename TValue, typename TVariant, typename TAllocator>
inline void Add(
std::vector<TVariant, TAllocator>& attributes,
const TValue& value)
{
attributes.push_back(TVariant(value));
}
template <typename TVariant, typename TValue, typename TAllocator>
inline std::vector<TVariant, TAllocator>& operator<<(
std::vector<TVariant, TAllocator>& attributes,
const TValue& value)
{
Add(attributes, value);
return attributes;
}
我想在单独的头文件 PointVariantHelper.h
中为类 PointXY
扩展此助手:
// forward declaration
template <typename TValue, typename TVariant, typename TAllocator>
inline void Add(
std::vector<TVariant, TAllocator>& attributes,
const TValue& value);
template <typename TVariant, typename TAllocator>
inline void Add(
std::vector<TVariant, TAllocator>& attributes,
const PointXY& pnt)
{
Add(attributes, CoordinateX(pnt.X()));
Add(attributes, CoordinateY(pnt.Y()));
}
要为 PointXY
使用助手,我需要:
#include "PointVariantHelper.h"
#include "VariantHelper.h"
问题
Add
否则将无法正确解析)。这个 SO 问题中描述了类似的问题:“Name lookup for overloaded functions defined later”。目标
最佳答案
我认为使用具有静态函数的模板类而不是一组可能重载的模板函数可以解决问题:
VariantHelperAddHelper.h
template <typename TValue, typename TVariant, typename TAllocator>
struct AddHelper
{
static void
Do(std::vector<TVariant, TAllocator> & attributes, const TValue & value)
{
attributes.push_back(TVariant(value));
}
};
VariantHelper.h
#include "VariantHelperAddHelper.h"
template <typename TValue, typename TVariant, typename TAllocator>
inline void
Add(std::vector<TVariant, TAllocator> & attributes, const TValue & value)
{
AddHelper<TValue, TVariant, TAllocator>::Do(attributes, value);
}
PointVariantHelper.h
#include "VariantHelperAddHelper.h"
// specialization for point
template <typename TVariant, typename TAllocator>
struct AddHelper<PointXY, TVariant, TAllocator>
{
static void
Do(std::vector<TVariant, TAllocator> & attributes, const PointXY & value)
{
AddHelper<CoordinateX, TVariant, TAllocator>::Do(
attributes, CoordinateX(pnt.X()));
AddHelper<CoordinateY, TVariant, TAllocator>::Do(
attributes, CoordinateY(pnt.Y()));
}
};
关于c++ - 正确地将常见的模板函数重载与专门的重载分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50907460/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!