繁体   English   中英

将const const成员函数转换为非const

[英]Cast const member function to non-const

是否在C ++中定义了成员函数指针的const 以下是有效代码吗?

struct T {
  void foo(int i) const { std::cout << i << std::endl;};
};

void (T::*f1)(int) const = &T::foo;
void (T::*f2)(int)       = reinterpret_cast<void (T::*)(int)>(f1);
T t;
(t.*f2)(1);

更新:

我需要这个的原因是我正在编写一个接受对象和指向该对象的成员函数指针的函数。 我需要一个const对象的版本(只接受const函数)和一个普通的。 由于我不想要重复代码,我的想法是将实际代码放在非const版本中并从const中调用它,抛弃任何consts。

编译器吃了它。 但落后演员更有用。

而且 - 但最好不要使用它,const_cast通常只是一个快速而肮脏的解决方案,只有在没有任何其他解决方案时才应用。

回答更新

如果我理解正确,你将使用一个对象和两个函数。 第一个函数接受const对象和const成员函数,第二个函数接受非const对象和非const成员函数。

根据给定的信息,您可以更改第二个函数以接受非const对象和const成员函数。 并给它们一个非const对象及其const成员函数。

是的,它是定义的,但如果函数真的是const,你可能不希望它,因为一些编译器优化(即返回值缓存)依赖于函数是const。

我没有看到这样做的理由:即使你可以,你也会让它更具限制性。 假设你有一个Foo类:

class Foo {
  void f() const;
  void g();
}

还有一些代码片段:

Foo a;
const Foo b;

然后你可以调用af()ag() ,但不能调用bg()因为bconst 如您所见,在成员函数之后放置const使其限制性降低,而不是更多。

并且,通过reinterpret_cast这个指针,你将获得具有完全相同值的指针(由于reinterpret_cast的性质),如果你试图调用它,你将进入相同的T :: foo()

你可以做到,但没有任何意义,无论你何时可以调用f2,你也可以调用f1。 你应该以另一种方式施展。 但是如果有什么东西,你应该投射对象,而不是函数。

void (T::*f1)(int) const = &T::foo;
void (T::*f2)(int)       = reinterpret_cast<void (T::*)(int)>(f1);
T t;
(t.*f2)(1); // compiles
(t.*f1)(1); // this compiles too!!

但如果你有

const T t;
(t.*f2)(1); // error t is const
(t.*f1)(1); // still compiles

唯一能解决歧义的是执行static_cast,这基本上是一种语言功能

#include <boost/typeof/typeof.hpp>
struct Test
{
    const int& foo();
    const int& foo() const;
};

int main()
{
    typedef const int&(Test::*non_const_ptr)();
    typedef const int&(Test::*const_ptr)()const;
    BOOST_TYPEOF(static_cast<non_const_ptr>(&Test::foo)) ss;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM