如何将 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。
我有一个类型 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。