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

标签 c++ c++11 templates constants c++14

除了函数名本身之外,模板使函数签名的大部分内容都可参数化。但是是否也可以参数化成员函数的常量?

琐碎、简约、非模板示例:

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/

相关文章:

c++ - 非模板代码有效时,模板代码无效!

c++ - Boost::log:基于级别的不同格式(HTML 格式)

c++ - 大 vector 和内存保护 C++

c++ - cv::warpPerspective 只显示变形图像的一部分

c++ - 无法访问 Friend 类的私有(private)构造函数

c++ - 线程安全 : Multiple threads reading from a single const source

C++ 11为什么在返回临时对象之前调用移动构造函数

javascript - Handlebars 计数器#each

amazon-web-services - AWS 云信息 :Template validation error

C++ 静态成员在初始化后重新初始化