我试图通过这样的模板存储成员函数指针:(这是我的真实代码的简化版本)
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) {}
};
然后我想对GApp中的每个重载方法执行以下操作:
connect(&GApp::foo); 
打电话给这个foo()是好的,但我怎么称它为foo(double d)?以下为什么不工作?
connect((&GApp::foo)(double)); 
它会给我
语法错误:'double'应以')'开头
我不明白这里必须使用的语法.这可能是一个愚蠢的问题,但任何人都可以帮助我吗?
请考虑以下代码
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
};
看,如果此参数是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));
}
如何在 …
我有很长一段时间遇到这个问题 - 我将固定大小的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(); ???
} 
我想将指针传递给M外面的矩阵.这也可能是很简单的,但我就是找不到适当的组合&和*等
感谢帮助.
我从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 …在C++ 03上编译时,我试图编写一个测试模板函数,它返回一个返回int的成员函数的指向成员函数的函数,并获取两个float参数:
template<typename TemplateClass>
int (TemplateClass::*)(float,float) Testtest(TemplateClass &A)
{
    return &TemplateClass::Function;
}
但很自然,无论我使用的指向成员函数的语法有什么变化,编译器都会抱怨初始化错误.Typedef,虽然它适用于已知的类,但由于显而易见的原因(命名冲突),不会接受我不能提前知道可能使用相同函数的类的模板类参数.
有什么非typedef方法可以让这个函数编译并返回一个指向成员函数的指针?
考虑以下代码:
struct AA
{
    int& rr;
};
有没有办法获得指针(或可能参考),AA::rr以获得这个?
AA* aa;
auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’
aa ->* mm;
此外,在gcc-7.0.1 decltype(AA::mm)仅仅是int&.这是根据标准吗?这有道理吗?
编辑
对不起,伙计,我提出的问题并不是很好.没有人抱怨引用不是对象或者没有指向引用的指针.目标很自私.鉴于struct AA { int& rr; };我只想拥有这样的函数:
template < typename Class, typename Member >
void test(Member Class::*) { }
在调用的时候test(&AA::rr)我想Class是AA和Member是int&或int.所以我甚至不需要指针本身,但它的类型将允许检索类类型和成员类型.
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);
}
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{ …我怀疑这是不可能的,但我想我会问.假设我有一个方法类:
class A {
public:
    void b(int c);
};
我可以创建一个指向该成员函数的指针:
void (A::*ptr)(int) = &A::b;
(someAInstance.*ptr)(123);
我也可以滥用函数指针并创建一个A直接获取参数的指针(我不知道这是否安全,但它可以在我的机器上运行):
void (*ptr2)(A*, int) = (void (*)(A*, int))&A::b;
(*ptr2)(&someAInstance, 123);
我想要的是以某种方式curry A参数,并创建一个函数指针,只需要一个int,但调用我预定义A::b的特定A实例上的方法.该A实例将为该特定函数指针保持不变,但可能有几个函数指针都指向同一个A::b方法,但使用不同的A实例.例如,我可以创建一个单独的包装函数:
A* someConstantA = new A;
void wrapper(int c) {
    someConstantA->b(c);
}
void (*ptr3)(int) = &wrapper;
现在我可以在ptr3不知道A调用它的特定功能的情况下使用,但是我必须定义一个特殊的函数来处理它.我需要一种方法来为任意数量的A实例制作指针,所以我不能像那样硬编码.这有可能吗?
编辑:应该提到,我被困在C++ 03的土地上,也不能使用Boost
为什么编译器将&Foo::foo其视为void (*)(). 我希望它被视为相反,void(Foo::*)()因为它是 的成员Foo。
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在 C++ 中,我正在寻找标准的关键部分\n解释我在该语言的两个指向成员的指针访问运算符之间观察到的行为的细微差别,.*以及->*。
根据下面显示的我的测试程序,虽然->*似乎允许其\n右手表达式是任何类型隐式转换为 \n pointer to member of S,.*但事实并非如此。当使用 ngcc 和 clang 进行编译时,两个编译器都会对标记为 \'(2)\' 的行产生错误,表明我的类Offset不能用作成员指针。
测试程序\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 …