除了函数名本身之外,模板使函数签名的大部分内容都可参数化。但是是否也可以参数化成员函数的常量?
琐碎、简约、非模板示例:
struct Foo {
Foo * self() { return this; }
Foo const * self() const { return this; }
};
vs 稻草人模板化假设:
struct Foo {
template<typename T> T self() std::constness_of(T) { return this; }
};
最佳答案
But is it also possible to parameterize the constness of a member function?
不,你不能。您在函数签名中无权访问 this
的隐式对象。点,所以你不能以任何方式发送它或模板。成员函数上的 cv 限定符必须拼写出来。
对于更复杂的成员函数,您可以让一个调用另一个(通常是非 const
调用 const
来避免 UB)以避免一些代码重复。
或者你总是可以写一个非成员(member) friend
:
struct Foo {
template <class T,
std::enable_if_t<std::is_base_of<Foo, std::decay_t<T>>::value>* = nullptr
>
friend T* self(T& x) { return &x; }
};
我们需要 SFINAE 来确保 self()
未找到意外类型,如 Wrapper<Foo>
.请注意,这比您的原始代码要长得多,因此仅在具有复杂逻辑的上下文中才有意义。
如果采用 UFCS 肯定会很有趣,现在我们都写 const
/非- const
通过非成员重载 friend
s 我们仍然像他们是成员一样调用。
关于c++ - 是否可以参数化模板化成员函数的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116378/