是否可以参数化模板化成员函数的常量?

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)

Bar*_*rry 7

但是也可以参数化成员函数的常量吗?

你不能.你没有在函数签名中访问隐含对象到哪个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,我们仍然会调用它们,就好像它们是成员一样.