我的类型A
设计为隐式投放到B
类型。以下是我希望在以下情况中使用它的示例:
// Current implementation:
std::transform(vec_of_a.begin(), vec_of_a.end(), std::back_inserter(vec_of_b),
[](const A& a) -> B { return a; }); // Thanks, Kerrek SB.
// Ideal implementation - Won't compile, expected '(' after 'static_cast'.
std::transform(vec_of_a.begin(), vec_of_a.end(), std::back_inserter(vec_of_b),
static_cast<B>);
如何使后一选项编译?
答案 0 :(得分:2)
static_cast<B>
,虽然使用函数调用语法调用它不能像其他可调用的东西一样传递。例如,没有办法使用&
来获取指向它的函数指针。
你可以使用一个简短的小lambda来实现类似于将函数指针传递给static_cast<B>
的东西,就像你当前的实现一样:
std::transform(vec_of_a.begin(), vec_of_a.end(), std::back_inserter(vec_of_b),
[](const A& a) -> B { return a; });
另一种选择 - 在这种特殊情况下 - 是从vector<B>
构建vector<A>
:
std::vector<B> vec_of_b(vec_of_a.begin(), vec_of_a.end());
答案 1 :(得分:1)
构建包含DBMS_METADATA.GET_DDL
的函子:
static_cast
这样,您可以致电template <typename T>
struct StaticCast
{
template <typename U>
T operator()(const U& rhs)
{
return static_cast<T>(rhs);
}
};
:
std::transform
可以在已经定义输出矢量代替注释中所示的lambda的情况下使用。如果没有,则更喜欢another answer **中提到的构造函数。
如果需要,此仿函数版本符合C ++ 98的要求-即使OP被标记为std::transform(vec_of_a.begin(), vec_of_a.end(), std::back_inserter(vec_of_b), StaticCast<b>());
,也应注意这一点。
**请注意,使用此特定的构造函数,VS编译器会引发警告C4244(已通过VS2017测试)。
答案 2 :(得分:-3)
是的,这就是匿名函数在C ++中的工作方式,static_cast
不是函数,因此您无法将其地址作为映射函数传递。你必须处理它。
您也不能使用构造函数。