将模板类重新解释为const版本



AFAIK,具有模板参数<Type>的模板类与<const Type>完全不同。

template<typename T>
struct Wrapper
{
T obj = T{};
//other code 
};

现在我无法将Wrapper<int>&传递给需要Wrapper<const int>&的函数。

void someFunc(Wrapper<const int>& wrapper);
//...
Wrapper<int> wrapper;
someFunc(wrapper); //error

reinterpret_cast将其设置为常量版本会出现什么问题?

operator Wrapper<const T>&() { return *(reinterpret_cast<Wrapper<const T>*>(this)); }

将上面的行添加到Wrapper可以使它在不必创建新的<const int>对象的情况下工作。函数内部无法访问obj,因此传递的参数实际上是<const Type>还是<Type>应该无关紧要。

如果没有模板专业化,这里会出错吗(就标准与实践而言(?

在常量和非常量情况下,有许多优化可能不同,这意味着类的内存布局(例如,由于常量对象实际上不需要存在(和类的使用可能不同。

换言之:对此使用repret_cast可能会导致意外行为,不应该这样做。

在我看来,有几种方法可以使const关键字的过度使用导致更复杂的代码而没有任何好处,这就是其中之一
我建议避免<const Type>案例,而不是试图处理它们。

在不了解用例的情况下,在我看来,大多数用例都将通过使用const Wrapper<T>而不是Wrapper<const T>来覆盖。

相关内容

  • 没有找到相关文章

最新更新