C 变化宏或变异模板
C++ variadic macro or variadic template?
我想简化一些代码,并想帮助弄清楚是否有一种方法可以使用variadic宏或更好的variadic模板进行操作。下面的示例代码将显示我要做的事情。
#include <string>
#include <iostream>
#include <map>
#include <typeinfo>
// Class that registers an external function handler
template <typename ReturnType, typename... Args> class Redirector
{
const std::string &m_funcName;
public:
typedef ReturnType (*FuncTy)(Args...);
Redirector(const std::string &functionName, FuncTy pfunc) : m_funcName(functionName)
{
GetMap()[functionName] = pfunc;
}
~Redirector()
{
auto i = GetMap().find(m_funcName);
if (i == GetMap().end()) return;
i->second = nullptr;
GetMap().erase(m_funcName);
}
static std::map<std::string, FuncTy> &GetMap()
{
static std::map<std::string, Redirector::FuncTy> _map;
return _map;
}
static FuncTy &GetHandler(std::string functionName)
{
auto i = GetMap().find(functionName);
if (i == GetMap().end()) {
std::cerr << functionName << " is not present in the list of functions to be redirected.n";
exit(-1);
}
return i->second;
}
};
// Actual functions we want to call
void foo(int a)
{
std::cout << "foo:" << a << std::endl;
}
void bar(double b, int *p)
{
std::cout << "bar:" << b << " and " << p << std::endl;
}
// Redirection Handlers
void foo1(int A)
{
auto handle = Redirector<void, int>::GetHandler("_FOO");
handle(A);
}
Redirector<void, int>_FOOHandler("_FOO", reinterpret_cast<Redirector<void, int>::FuncTy>(foo));
void bar1(double B, int *P)
{
auto handle = Redirector<void, double, int *>::GetHandler("_BAR");
handle(B, P);
}
Redirector<void, double, int *>_BARHandler("_BAR", reinterpret_cast<Redirector<void, double, int *>::FuncTy>(bar));
// Main
int main()
{
int i = 7;
foo1(i);
bar1(3.4, &i);
return 0;
}
假设会有很多foo1&amp;所需的BAR1函数和所有这些功能都会执行相同的功能,仅会采用不同数量的参数和不同类型的参数。以下不是一个工作的宏,而只是显示我要做什么的想法:
define REGISTER_HANDLER(NAME,PARAMS)
void NAME ## 1(PARAMS)
{
auto handle = Redirector<PARAM_TYPES>::GetHandler("_"#NAME);
handle(PARAM_NAMES);
}
Redirector<PARAM_TYPES>NAME ## Handler("_"#NAME, reinterpret_cast<Redirector<PARAM_TYPES>::FuncTy>(foo));
REGISTER_HANDLER(foo,int a);
REGISTER_HANDLER(bar,double b,int *p);
我已经考虑将__VA_ARGS__
用于宏,但是我不太了解如何仅获取参数类型或参数名称。
我想我找到了一个有效的解决方案:
#define REGISTER_HANDLER(NAME,...)
template<typename... Args>
void NAME##1(Args... args)
{
auto handle = Redirector<void, Args...>::GetHandler("_"#NAME);
handle((args)...);
}
Redirector<void,__VA_ARGS__>NAME ## HandlerObject("_"#NAME, reinterpret_cast<Redirector<void,__VA_ARGS__>::FuncTy>(NAME));
REGISTER_HANDLER(foo,int);
REGISTER_HANDLER(bar,double, int*);
如果有人有更好的主意,请告诉我。
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 迭代器在递增和递减时是否保证会变异?
- C++11:具有互斥锁的线程看到原子变量的值发生变化,尽管这是唯一可以改变它的代码
- 为什么预减量会导致奇怪的变化?
- MATLAB:跟踪imufilter对象中的状态变化
- 当父小部件大小发生变化时,如何更改子小部件的大小?
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- C 变化宏或变异模板