Nan*_*mbe 2 c++ casting function-pointers std c++11
功能模板std::transform()采用一个范围,并用运算符对其进行局部操作,然后将结果保存在另一个范围中。在下面的示例中,该函数采用std::initializer_list称为的泛型,nl并对其进行操作,(std::string (*)(T)) std::to_string以将其所有条目转换为字符串,然后将结果存储在名为的字符串数组中buffer。
class num_list
{
public:
template<typename T>
num_list(std::initializer_list<T> nl):
size{nl.size()},
buffer(new std::string[size])
{
std::transform(nl.begin(), nl.end(), // input sequence
buffer, // output result
(std::string (*)(T))std::to_string); // unary operator
}
//...
private:
std::size_t size;
std::string * buffer;
};
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我们需要类型转换std::to_string为函数指针才能起作用。如果将强制类型转换为指针指向函数的类型,为什么代码无法使用C ++ 11编译(std::string (*)(T))?我无法解读编译器引发的抱怨。
error: no instance of overloaded function "std::transform" matches the argument list
Run Code Online (Sandbox Code Playgroud)
std::transform是一个通过模板参数类型获取函数对象的函数模板。由于类型是模板参数,因此必须推导它。 std::to_string是一个重载函数,因此当您尝试推断其类型时,会得到多个结果。由于推论中没有其他内容可以帮助缩小类型,因此编译器将无法推导类型,std::to_string您将得到一个错误。
当你施放std::to_string的std::string (*)(T),你现在只拥有单一类型的编译器来推断,这确实如此,你可以编译成功。
相反铸造的,你可以使用一个通用的λ转发到std::to_string不是像
std::transform(nl.begin(), nl.end(), // input sequence
buffer, // output result
([](auto&& val){ return std::to_string(val);});
Run Code Online (Sandbox Code Playgroud)
但这至少需要C ++ 14。对于C ++ 11,您可以使用T像这样的参数类型
std::transform(nl.begin(), nl.end(), // input sequence
buffer, // output result
([](const T& val){ return std::to_string(val);});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |