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

How do I pass static_cast<T> as a function?

我有一个类型 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>);

我该怎么做才能编译后一个选项?

是的,这就是匿名函数在 C++ 中的工作方式,并且 static_cast 不是函数,因此您不能将其地址作为映射函数传递。你将不得不处理它。

您也不能使用构造函数。

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<A>:

构造一个 vector<B>
std::vector<B> vec_of_b(vec_of_a.begin(), vec_of_a.end());

(此答案是对问题和 bipll's 的评论的总结。)

构建一个包含 static_cast 的仿函数:

template <typename T>
struct StaticCast
{
    template <typename U>
    T operator()(const U& rhs)
    {
        return static_cast<T>(rhs);
    }
};

有了这个,你可以调用 std::transform:

std::transform(vec_of_a.begin(), vec_of_a.end(), std::back_inserter(vec_of_b), StaticCast<b>());

它可以用于已经定义了输出向量来代替注释中显示的 lambda 的情况。如果没有,更喜欢 **.

中提到的构造函数

如果需要,此仿函数版本与 C++98 兼容 -- 即使 OP 被标记 C++11,这一点可能值得注意。

** 请注意,对于这个特定的构造函数,VS 编译器(使用 VS2017 测试)会引发警告 C4244。