gpt4 book ai didi

c++ - 新构造的对象作为默认模板函数参数

转载 作者:行者123 更新时间:2023-11-28 03:26:00 25 4
gpt4 key购买 nike

Test::load 应该将数据(通过名称或索引描述)加载到传递的引用中。作为第三个参数,在加载失败的情况下有一个默认值(数据从文件加载)。

struct Test
{
template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b)
{
std::cout << "1";
}

template <typename ValueType, typename DefaultValueType>
void load(int i, ValueType & a, DefaultValueType b)
{
std::cout << "2";
}
};

我需要 ValueTypeDefaultValueType,因为我对字符串和自定义类型有特殊需求。当我想使用默认构造类型作为从 ValueType 推导的默认第三个参数(在 const char * 版本中)时出现问题。

template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b = ValueType())
{
std::cout << "1";
}

我收到 expects 3 arguments 错误 (vs2010)。

为什么它不起作用?我需要采取变通办法才能完成这项工作。


如果有人有兴趣玩,这里有完整的“工作”代码

#include <iostream>

struct Test
{
template <typename ValueType, typename DefaultValueType>
void load(const char * c, ValueType & a, DefaultValueType b/* = ValueType()*/)
{
std::cout << "1";
}

template <typename ValueType, typename DefaultValueType>
void load(int i, ValueType & a, DefaultValueType b)
{
std::cout << "2";
}

//Workaround
template<typename ValueType>
void load(const char * c, ValueType & v)
{
load(c,v,ValueType());
}
};

int main()
{
Test t;
float f;

//This is standard behavior
t.load("bar", f, 0.0f);

//I want this to be possible call
t.load("bar", f);
}

最佳答案

您正在寻找部分template specialization .然而,部分模板特化仅适用于类而不适用于函数。对于函数,您可以通过重载来解决问题,这正是您在解决方法中所做的。

这是一个writeup关于为什么模板函数具有重载而不是特化。

关于c++ - 新构造的对象作为默认模板函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13938128/

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