是否可以将宏扩展为两段不同类型的数据

Is it possible to expand a macro into two piece of data with different types

更新

看来原题不是很清楚,所以我又做了一个例子来说明我需要什么。

#define RPC_FUNC(X) &X,???   // I don't know how...

class Test {
public:
    static void func(int a) {}
};


int main()
{
    const auto ptr1 = std::make_pair(&Test::func, "Test::func");
    // const auto ptr2 = std::make_pair(RPC_FUNC(Test::func));
    // ptr2.first(123);  // this should call the function Test::func
    // std::cout << ptr2.second; // this should print the string "Test::func"
    
    return 0;
}

如何定义宏 RPC_FUNC 来使这段代码工作?意思是我想让 ptr1ptr2 完全一样。

原版

我想做一段这样的代码:

template<typename F> // F is the type of some functions
void func(F f, const std::string& funcMark) {
    // do something
}

我想将一个非静态成员函数和一个字符串传递给函数func

有时,第二个参数只是第一个参数的名称。让我们看一个例子:

namespace sp {
class Test {
public:
    void doJob() {}
};
}

func(&sp::Test::doJob, "doJob");

我想要做的是像这样进行上面的调用:func(MY_MARCO(sp::Test::doJob)).

意思是,宏 MY_MACRO 应该将其参数 sp::Test::doJob 扩展为 &sp::Test::doJob, "doJob"

宏应该做什么的规范是模糊的。字符串化运算符 # 可以将宏参数转换为字符串文字:

// example code what it does
#include <iostream>

#define YOUR_MACRO(X) X() << " from " << #X "()"

int foo() { return 42; }

int main() { std::cout << YOUR_MACRO(foo) << std::endl; }

输出

42 from foo()

将字符串文字转换为 std::string 也很简单:

#include <iostream>
#include <string>

#define YOUR_MACRO(X) X() << " from " << std::string(#X "()")

int foo() { return 42; }

int main() { std::cout << YOUR_MACRO(foo) << std::endl; } 

效果相同。那么你卡在哪里了?

更新:

规格现在好多了!但它 与我已经发布的内容基本相同,您应该在宏中使用字符串化运算符 #:

#include <iostream>

#define RPC_FUNC(X) &X, #X

class Test {
public:
    static void func(int a) {
        std::cout << "called Test::func(" << a << ")" << std::endl;
    }
};

int main() {
    const auto ptr1 = std::make_pair(&Test::func, "Test::func"); // gets warning about unused variable
    const auto ptr2 = std::make_pair(RPC_FUNC(Test::func));
    ptr2.first(123);  // prints "called Test::func(123)"
    std::cout << ptr2.second << std::endl; // prints "Test::func"
    return 0;
}