模板const /非const参数强制转换

时间:2016-03-23 13:00:24

标签: c++ templates

我经历了一些搜索但却找不到这个搜索。考虑一下这种情况:

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感觉很腥(是吗?)。但有没有我错过的某种技巧的解决方案?任何人都知道为什么标准不能简单地发现这是好事吗?或者这个演员有什么“坏”吗?

2 个答案:

答案 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;
};

这两个类是无关的(即使看起来相同)。