使用带有转换的模板
Using a template with transform
我在c++中使用算法库的转换函数时遇到问题。我想将它与一元模板函数一起使用,这意味着我的转换函数需要3个迭代器和该函数作为参数。然而,我的程序崩溃了,编译器告诉我缺少一个没有意义的参数,因为我的函数是一元函数,而不是二进制运算。
我的代码如下:
template <typename T>
T reciprocal ( T value )
{ return (T)1/value ; }
int main()
{
vector<int> vec(5, 2);
transform(vec.begin(), vec.end(), vec.begin(), reciprocal);
}
是否禁止使用带有转换的模板?
reciprocal
是一个函数模板,而std::transform
无法确定要使用哪种特殊化。你需要明确并给它一个模板参数:
transform(vec.begin(), vec.end(), vec.begin(), reciprocal<int>);
请注意,在您的情况下,您将执行整数除法1/2
,这将给您一堆零。为了说明浮点倒数计算,以及reciprocal
的模板参数不必与vec
的模板参数相同,您可以尝试以下操作:
std::vector<double> vec2;
std::transform(vec.begin(),
vec.end(),
std::back_inserter(vec2),
reciprocal<double>);
这将导致vec2
包含五个0.5
值。
但是我的程序崩溃了,编译器告诉我缺少一个没有意义的参数,因为我的函数是一元函数,而不是二进制运算
您应该清楚地说明您的程序是否编译然后崩溃,而不是编译,编译器崩溃以及缺少什么类型的参数。
现在猜测一下你的意思,问题是transform
模板没有对最后一个参数施加任何限制,因此编译器无法确定reciprocal
的哪些重载(专门化)应该传递给转换模板。您可以手动指定您想要的:
transform(vec.begin(), vec.end(), vec.begin(), &reciprocal<int>);
或者可以禁止使用带有转换的模板?
这本身就是一个有趣的点,因为它显示了一些常见的误解。template
是创建其他元素的蓝图。在这种情况下,您有一个函数模板,它只是一个蓝图,编译器将通过替换模板参数来生成不同的功能。在需要函数的任何上下文中,都不能使用功能模板,尽管可以使用specialized(即,从function template生成的function)。
在某些情况下,您可以使用模板的名称来引用具体的专业化,这会变得有点令人困惑。也就是说,在类模板定义(或其成员的定义)中,模板的名称可以用来引用专业化。在函数模板的情况下,模板的名称可用于指代在编译器将能够丢弃除一个专门化之外的所有专门化的情况下功能模板 在[1]中,int call(int (*ptr)(int)) { return ptr(5); }
call(reciprocal); // [1]
reciprocal
指的是函数模板的所有reciprocal<int>
)可以用作call
的参数。
但这些都是例外,主要的一点是类模板或函数模板别或者功能,而是编译器可以从中创建类和函数的生成器。
现在,您需要依靠编译器来推断实例化reciprocal
的正确类型,但由于您尚未指定参数类型,因此无法执行此操作。
正如@jaunchopanza已经指出的那样,您可以通过指定正确的类型来解决这个问题。通过稍微不同地构建代码:
struct reciprocal {
template <typename T>
T operator()(T value)
{
return (T) 1 / value;
}
};
你可以让编译器来推导类型,所以代码如下:
std::transform(vec.begin(), vec.end(), vec.begin(), reciprocal());
工作正常(不过请注意parens以创建reciprocal
的实例)。
当然,int
s上的倒数通常没有多大意义——它所能产生的只是0或1(或0输入的未定义行为)。您可能想要使用浮点类型来获得有意义的结果:
std::vector<double> vec(5, 2);
std::transform(vec.begin(), vec.end(), vec.begin(), reciprocal());
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++