标签: pointer-to-member

重载的成员函数指向模板的指针

我试图通过这样的模板存储成员函数指针:(这是我的真实代码的简化版本)

template<class Arg1>
void connect(void (T::*f)(Arg1)) 
{
    //Do some stuff
}

template<class Arg1>
void connect(void (T::*f)()) 
{
    //Do some stuff
}

class GApp
{
public:
    void foo() {}

    void foo(double d) {}
};
Run Code Online (Sandbox Code Playgroud)

然后我想对GApp中的每个重载方法执行以下操作:

connect(&GApp::foo); 
Run Code Online (Sandbox Code Playgroud)

打电话给这个foo()是好的,但我怎么称它为foo(double d)?以下为什么不工作?

connect((&GApp::foo)(double)); 
Run Code Online (Sandbox Code Playgroud)

它会给我

语法错误:'double'应以')'开头

我不明白这里必须使用的语法.这可能是一个愚蠢的问题,但任何人都可以帮助我吗?

c++ templates pointer-to-member

6
推荐指数
2
解决办法
5516
查看次数

如何在编译时保存指向成员的指针?

请考虑以下代码

template<typename T, int N>
struct A {
  typedef T value_type; // OK. save T to value_type
  static const int size = N; // OK. save N to size
};
Run Code Online (Sandbox Code Playgroud)

看,如果此参数是typename或整数值,则可以保存任何模板参数.问题是指向成员的指针是一个偏移量,即整数.现在我想在编译时保存任何指向成员的指针:

struct Foo {
   int m; 
   int r;
};

template<int Foo::*ptr_to_member>
struct B {
   // Next statement DOES NOT WORK!
   static int Foo::* const saved_ptr_to_member = ptr_to_member; 
};

// Example of using
int main() {
    typedef B<&Foo::m> Bm;
    typedef B<&Foo::r> Br;
    Foo foo;
    std::cout << (foo.*(Bm::saved_ptr_to_member));
}
Run Code Online (Sandbox Code Playgroud)

如何在 …

c++ templates pointer-to-member

6
推荐指数
1
解决办法
1297
查看次数

将指针传递给2D数组c ++

我有很长一段时间遇到这个问题 - 我将固定大小的2D数组作为类成员.

class myClass
{ 
public:
        void getpointeM(...??????...);
        double * retpointM();

private:

   double M[3][3];

};

int main()
{
     myClass moo;
     double *A[3][3];

     moo.getpointM( A );  ???
     A = moo.retpointM(); ???

} 
Run Code Online (Sandbox Code Playgroud)

我想将指针传递给M外面的矩阵.这也可能是很简单的,但我就是找不到适当的组合&*

感谢帮助.

c++ arrays multidimensional-array pointer-to-member

6
推荐指数
1
解决办法
5217
查看次数

了解指向成员的运营商

我从c ++练习册中复制了这个程序.幕后发生了什么?

预期的产出是:

sum = 30 sum = 70

#include<iostream>
using namespace std;

class M
{
    int x;
    int y;
public:
    void set_xy(int a, int b)
    {
        x=a;
        y=b;
    }
    friend int sum(M m);
};

int sum (M m);
//so far so good, problem begins from here. what's happening after here?
{                               
    int M ::*px = &M ::x;
    int M ::*py = &M ::y;
    M *pm =&m;
    int s= m.*px+ pm->*py;
    return s;
}

int main()
{
    M n;
    void …
Run Code Online (Sandbox Code Playgroud)

c++ pointers compiler-errors pointer-to-member dereference

6
推荐指数
1
解决办法
1205
查看次数

返回指向成员函数的指针(没有typedef)

在C++ 03上编译时,我试图编写一个测试模板函数,它返回一个返回int的成员函数的指向成员函数的函数,并获取两个float参数:

template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
    return &TemplateClass::Function;
}
Run Code Online (Sandbox Code Playgroud)

但很自然,无论我使用的指向成员函数的语法有什么变化,编译器都会抱怨初始化错误.Typedef,虽然它适用于已知的类,但由于显而易见的原因(命名冲突),不会接受我不能提前知道可能使用相同函数的类的模板类参数.

有什么非typedef方法可以让这个函数编译并返回一个指向成员函数的指针?

c++ member-functions pointer-to-member c++03

6
推荐指数
1
解决办法
154
查看次数

如何获取引用成员的指针?

考虑以下代码:

struct AA
{
    int& rr;
};
Run Code Online (Sandbox Code Playgroud)

有没有办法获得指针(或可能参考),AA::rr以获得这个?

AA* aa;
auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’
aa ->* mm;
Run Code Online (Sandbox Code Playgroud)

此外,在gcc-7.0.1 decltype(AA::mm)仅仅是int&.这是根据标准吗?这有道理吗?


编辑

对不起,伙计,我提出的问题并不是很好.没有人抱怨引用不是对象或者没有指向引用的指针.目标很自私.鉴于struct AA { int& rr; };我只想拥有这样的函数:

template < typename Class, typename Member >
void test(Member Class::*) { }
Run Code Online (Sandbox Code Playgroud)

在调用的时候test(&AA::rr)我想ClassAAMemberint&int.所以我甚至不需要指针本身,但它的类型将允许检索类类型和成员类型.

c++ gcc reference pointer-to-member argument-deduction

6
推荐指数
1
解决办法
1098
查看次数

Constexpr指向数据成员转换的指​​针

GCC 8.2.1和MSVC 19.20编译以下代码,但是Clang 8.0.0和ICC 19.0.1不能这样做。

// Base class.
struct Base {};

// Data class.
struct Data { int foo; };

// Derived class.
struct Derived : Base, Data { int bar; };

// Main function.
int main()
{
  constexpr int Data::* data_p{ &Data::foo };
  constexpr int Derived::* derived_p{ data_p };
  constexpr int Base::* base_p{ static_cast<int Base::*>(derived_p) };

  return (base_p == nullptr);
}
Run Code Online (Sandbox Code Playgroud)

Clang 8.0.0的错误消息如下:

case.cpp:16:33: error: constexpr variable 'base_p' must be initialized by a constant expression
  constexpr int Base::* base_p{ …
Run Code Online (Sandbox Code Playgroud)

c++ pointer-to-member language-lawyer constexpr

6
推荐指数
1
解决办法
218
查看次数

动态创建一个函数指针,该指针调用给定实例上的方法

我怀疑这是不可能的,但我想我会问.假设我有一个方法类:

class A {
public:
    void b(int c);
};
Run Code Online (Sandbox Code Playgroud)

我可以创建一个指向该成员函数的指针:

void (A::*ptr)(int) = &A::b;
(someAInstance.*ptr)(123);
Run Code Online (Sandbox Code Playgroud)

我也可以滥用函数指针并创建一个A直接获取参数的指针(我不知道这是否安全,但它可以在我的机器上运行):

void (*ptr2)(A*, int) = (void (*)(A*, int))&A::b;
(*ptr2)(&someAInstance, 123);
Run Code Online (Sandbox Code Playgroud)

想要的是以某种方式c​​urry A参数,并创建一个函数指针,只需要一个int,但调用我预定义A::b的特定A实例上的方法.该A实例将为该特定函数指针保持不变,但可能有几个函数指针都指向同一个A::b方法,但使用不同的A实例.例如,我可以创建一个单独的包装函数:

A* someConstantA = new A;
void wrapper(int c) {
    someConstantA->b(c);
}

void (*ptr3)(int) = &wrapper;
Run Code Online (Sandbox Code Playgroud)

现在我可以在ptr3不知道A调用它的特定功能的情况下使用,但是我必须定义一个特殊的函数来处理它.我需要一种方法来为任意数量的A实例制作指针,所以我不能像那样硬编码.这有可能吗?


编辑:应该提到,我被困在C++ 03的土地上,也不能使用Boost

c++ function-pointers pointer-to-member

5
推荐指数
1
解决办法
5351
查看次数

传递一个指向静态方法的指针

为什么编译器将&Foo::foo其视为void (*)(). 我希望它被视为相反,void(Foo::*)()因为它是 的成员Foo

\n\n
class Foo\n{\n    public:\n        static void foo ( void ){}\n};\n\nvoid foo ( void(Foo::*)(void) ){}\n\nint main()\n{   \n    foo(&Foo::foo);  // error: cannot convert \xe2\x80\x98void (*)()\xe2\x80\x99 to \xe2\x80\x98void (Foo::*)()\xe2\x80\x99\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

c++ pointers function-pointers pointer-to-member

5
推荐指数
1
解决办法
3768
查看次数

指向成员的指针访问运算符的行为差异

在 C++ 中,我正在寻找标准的关键部分\n解释我在该语言的两个指向成员的指针访问运算符之间观察到的行为的细微差别,.*以及->*

\n

根据下面显示的我的测试程序,虽然->*似乎允许其\n右手表达式是任何类型隐式转换为 \n pointer to member of S.*但事实并非如此。当使用 ngcc 和 clang 进行编译时,两个编译器都会对标记为 \'(2)\' 的行产生错误,表明我的类Offset不能用作成员指针。

\n

测试程序\n https://godbolt.org/z/46nMPvKxE

\n
#include <iostream>\n\nstruct S { int m; };\n\ntemplate<typename C, typename M>\nstruct Offset\n{\n    M C::* value;\n    operator M C::* () { return value; }  // implicit conversion function\n};\n\nint main()\n{\n    S s{42};\n    S* ps = &s;\n    Offset<S, int> offset{&S::m};\n\n    std::cout << ps->*offset << \'\\n\';  // (1) ok\n    std::cout << s.*offset …
Run Code Online (Sandbox Code Playgroud)

c++ pointer-to-member language-lawyer implicit-conversion

5
推荐指数
1
解决办法
174
查看次数