gpt4 book ai didi

c++ - 正确地将常见的模板函数重载与专门的重载分开?

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

问题

  • 在单独的文件中使用模板助手和额外的专门重载以便包含顺序无关的正确方法是什么?

  • 在类似我的情况下,是否有正确的处理方法(见下文描述)?

免责声明:我不确定描述是否措辞恰当。请随时帮助更好地表达它。

描述

我正在使用的代码依赖于使用 boost::variantstd::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"

问题

目标

  • 变体助手和专用助手应该分开,用户应该只包含所需类的助手

最佳答案

我认为使用具有静态函数的模板类而不是一组可能重载的模板函数可以解决问题:

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/

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