Cat*_*kul 12 c++ templates const c++11 c++14
除了函数名称本身之外,模板使函数签名的大部分内容都可以参数化.但是也可以参数化成员函数的常量吗?
琐碎,极简主义,非模板化的例子:
struct Foo {
Foo * self() { return this; }
Foo const * self() const { return this; }
};
Run Code Online (Sandbox Code Playgroud)
与稻草人模板假设:
struct Foo {
template<typename T> T self() std::constness_of(T) { return this; }
};
Run Code Online (Sandbox Code Playgroud)
但是也可以参数化成员函数的常量吗?
你不能.你没有在函数签名中访问隐含对象到哪个this点,所以你不能以任何方式对它或模板进行调度.必须详细说明成员函数的cv限定符.
对于更复杂的成员函数,您可以让一个调用另一个(通常是非const调用const一个以避免UB)以避免某些代码重复.
或者你总是可以写一个非会员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; }
};
Run Code Online (Sandbox Code Playgroud)
我们需要SFINAE来确保self()找不到类似的意外类型Wrapper<Foo>.请注意,这比原始代码要长得多,所以在具有复杂逻辑的环境中才真正有意义.
如果UFCS被采用,肯定会很有趣,现在我们都通过非成员编写我们的const/非const重载friend,我们仍然会调用它们,就好像它们是成员一样.