为什么编译器不能(或不能)推断出 static_cast 的类型参数?
Why can't (or doesn't) the compiler deduce the type parameter of static_cast?
我有一些(遗留)代码如下所示:
void castFoo(string type, void* foo) {
FooA* foo_a = NULL;
FooB* foo_b = NULL;
if (type == "A") {
foo_a = static_cast<FooA*>(foo);
} else {
foo_b = static_cast<FooB*>(foo);
}
// now do things with one of the two foo's
}
这是非常旧的代码,我意识到这是进行此处发生的那种向下转换的糟糕方法。但这让我很好奇:为什么我不能这样写?
if (type == "A") {
foo_a = static_cast(foo);
} else {
foo_b = static_cast(foo);
}
它对编译器来说肯定是明确的,对我来说它看起来像是函数中的正常模板参数推导。为什么这里没有进行类型推导?
静态转换很危险。在这种情况下,转换 to/from void 必须转到完全相同的类型。
隐式 typimg 将允许不直接与强制转换相邻的代码更改,从而使两个强制转换产生未定义的行为。
你可以编写你想要的代码,尽管它是不明智的。
template<class V>
struct implicit_static_cast_t{
V v;
template<class T>
operator T()&&{
return static_cast<T>(std::forward<V>(v));
}
};
template<class In>
implicit_static_cast_t<In>
auto_static_cast(In&& in){
return {std::forward<In>(in)};
}
现在 auto_static_cast
表现得像你想要的 static_cast
表现得像。
我有一些(遗留)代码如下所示:
void castFoo(string type, void* foo) {
FooA* foo_a = NULL;
FooB* foo_b = NULL;
if (type == "A") {
foo_a = static_cast<FooA*>(foo);
} else {
foo_b = static_cast<FooB*>(foo);
}
// now do things with one of the two foo's
}
这是非常旧的代码,我意识到这是进行此处发生的那种向下转换的糟糕方法。但这让我很好奇:为什么我不能这样写?
if (type == "A") {
foo_a = static_cast(foo);
} else {
foo_b = static_cast(foo);
}
它对编译器来说肯定是明确的,对我来说它看起来像是函数中的正常模板参数推导。为什么这里没有进行类型推导?
静态转换很危险。在这种情况下,转换 to/from void 必须转到完全相同的类型。
隐式 typimg 将允许不直接与强制转换相邻的代码更改,从而使两个强制转换产生未定义的行为。
你可以编写你想要的代码,尽管它是不明智的。
template<class V>
struct implicit_static_cast_t{
V v;
template<class T>
operator T()&&{
return static_cast<T>(std::forward<V>(v));
}
};
template<class In>
implicit_static_cast_t<In>
auto_static_cast(In&& in){
return {std::forward<In>(in)};
}
现在 auto_static_cast
表现得像你想要的 static_cast
表现得像。