我有一个大量的模板化类,我想从中使用吸气剂。遵循通用约定,我避免了像这样的代码重复:
template< typename Foo, typename... Bars >
class Templated
{
...
constexpr const Foo& get() const
{
return mFoo;
}
constexpr Foo& get()
{
return const_cast<Foo&>(const_cast<const Templated<Foo, Bars...> *>(this)->get());
}
但是我想到第二个定义有点笨拙,尤其是对于具有许多模板参数的类。幸运的是,经过一番混乱之后,我发现可以将任何通用类模板简化为:
constexpr Foo& get()
{
return const_cast<Foo&>(const_cast<decltype(this)>(this)->get());
之所以起作用,是因为出于某种原因,decltype(this)解析为指向类对象类型的const指针,而just(this)解析为指向类对象类型的非const指针。为什么这是事实呢?
答案 0 :(得分:1)
“不需要指向类对象类型的const指针”。
this
是不可变的(this = nullptr;
是非法的)。不是*this
。
只需使add_const
和remove_const
模板函数(或者如果您的C ++版本足够新,则使用std::as_const
)就可以使您的生活更加轻松:>
template<typename T>
const T* add_const(T* ptr) { return ptr; } // no cast at all!
template<typename T>
T* remove_const(const T* ptr) { return const_cast<T*>(ptr); }
template<typename T>
T& remove_const(const T& ref) { return const_cast<T&>(ref); }
这里add_const(this)
正确地导致“指向const对象类型的非const指针”。
为此,您可以在类内部添加
auto cthis() const { return this; }