是否可以将宏扩展为两段不同类型的数据
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
来使这段代码工作?意思是我想让 ptr1
和 ptr2
完全一样。
原版
我想做一段这样的代码:
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;
}
更新
看来原题不是很清楚,所以我又做了一个例子来说明我需要什么。
#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
来使这段代码工作?意思是我想让 ptr1
和 ptr2
完全一样。
原版
我想做一段这样的代码:
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;
}