gpt4 book ai didi

c++ - 如何避免重复的模板特化?

转载 作者:行者123 更新时间:2023-11-30 02:26:51 25 4
gpt4 key购买 nike

我有一些函数可以处理由 C 库定义的类型。

类型有float_2, float_3, float_4, int32_2, int32_3, int32_4。

这些类型有一些共同点,一个名为 size 的字段。对于 float_2,size = 2。float_3,size = 3 等。

现在我有一个针对每种类型的模板特化。

static void add_number(rapidjson::Value &target, const char* name, float_2 src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
ss << src.x << " " << src.y;
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}

static void add_number(rapidjson::Value &target, const char* name, float_3 src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
ss << src.x << " " << src.y << " " << src.z;
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}

如果能够做到以下几点,那就太好了:

template <typename T>
static void add_number(rapidjson::Value &target, const char* name, T src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
switch(src.size){
case 2: ss << src.x << " " << src.y;
case 3: ss << src.x << " " << src.y << " " << src.z;
case 4: ss << src.x << " " << src.y << " " << src.z << " " << src.w;
}
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}

但这行不通,因为并非所有定义的类型都存在这些字段。是否有一些 C++ 魔术模板语法可以让我避免专门化每个案例?

最佳答案

我不确定这是否与打印本身、尺寸或任何其他特化要求有关。但是,我认为所呈现案例的最少特化是为不同案例重载流式运算符。看起来像这样:

std::ostream& operator<<(std::ostream &stream, const float_2 &vec)
{
return stream << vec.x << ", " << vec.y;
}

std::ostream& operator<<(std::ostream &stream, const float_3 &vec)
{
return stream << vec.x << ", " << vec.y << ", " << vec.z;
}

std::ostream& operator<<(std::ostream &stream, const float_4 &vec)
{
return stream << vec.x << ", " << vec.y << ", " << vec.z << ", " << vec.w;
}

template < typename T >
static void add_number(rapidjson::Value &target, const char* name, const T &src, Document::AllocatorType& alloc)
{
std::ostringstream ss;
ss << src;
std::string s(ss.str());
target.AddMember(StringRef(name), s, alloc);
}

关于c++ - 如何避免重复的模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42381195/

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