我经历了一些搜索但却找不到这个搜索。考虑一下这种情况:
template <class T> class TemplClass;
void a_function(TemplClass<const X>&);
TemplClass<X> inst;
a_function( inst ); // fails
“从'TemplClass'类型的表达式初始化'TemplClass&amp;'类型的引用”
据我所知,情况是100%安全的。尽管如此,C ++还是不允许这样做。所以我想知道使用什么演员而不是琐碎的C-cast。
a_function( static_cast<TemplClass<const X>&>(inst) ); // fails, similar error message
a_function( reinterpret_cast<TemplClass<const X>&>(inst) ); // works
dynamic_cast是不可能的,const_cast也失败了(这是正确的)。
reinterpret_cast感觉很腥(是吗?)。但有没有我错过的某种技巧的解决方案?任何人都知道为什么标准不能简单地发现这是好事吗?或者这个演员有什么“坏”吗?
答案 0 :(得分:3)
但是有没有我错过的某种技巧的解决方案?
理想的解决方案是不要编写这样的受限模板接口。例如,考虑标准库算法,它使迭代器表示范围而不是具有特定对象类型的特定模板类型。
如果您无法在第三方库中修改界面,那么您将无法将Templ<X>
复制到{{1}在打电话之前。
任何人都知道为什么标准不能简单地发现这是 什么好东西?
因为它不好。最简单的情况是有模板特化,它会改变一些含义/功能。编译器不能简单地更改模板的实例化。
或者有什么东西“坏”&#39;关于这个演员?
通过该语言,强制转换是非法的,因为const和非const模板实例化是不相关的类型。根据实际情况,可能存在合法的替代方案。
答案 1 :(得分:1)
TemplClass<const T>
和TemplClass<T>
是不相关的类型。
例如,您可能具有(部分)专业化,以使它们真正不同:
template<typename T>
class TemplClass
{
void generic();
std::string s;
};
template<typename T>
class TemplClass<const T>
{
void foo();
std::vector<int> v;
};
将一个投射到另一个中是没有意义的。
以同样的方式
class A
{
char* p;
};
class B
{
char* p;
};
这两个类是无关的(即使看起来相同)。