如何将static_cast <t>作为函数传递?

时间:2016-09-13 22:20:43

标签: c++11 functor static-cast

我的类型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>);

如何使后一选项编译?

3 个答案:

答案 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());

(此答案是对问题和bipll's answer的评论摘要。)

答案 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不是函数,因此您无法将其地址作为映射函数传递。你必须处理它。

您也不能使用构造函数。