0
我有一個宏:如何將宏生成的#foo字符串傳遞給模板類?
#define BIND(c_slot, cxx_target) c_slot = & Generate<
decltype(c_slot)
, decltype(&cxx_target)
, &cxx_target
>::call;
我會用這樣的:
BIND(table->fooslot , Base::foofunc);
Generate
看起來是這樣的:
template<typename Fc, typename Target, Target target>
struct Generate;
template < typename R , typename ...Arg ,
typename RTarg , typename ...TargArg ,
RTarg(ExtObjBase_noTemplate::*target)(TargArg...) >
struct Generate< R(*)(PyObject*, Arg...), RTarg(ExtObjBase_noTemplate::* )(TargArg...), target >
{
static R call(PyObject* self, Arg... carg)
{
std::cout << "SLOT!" << std::endl;
try
{
RTarg r_cxx = (cxxbase_for(self)->*target) (Convert<Arg>::to_cxx(carg) ...);
return Convert<RTarg>::to_c(r_cxx);
}
catch (...)
{
:
}
}
};
我想改善的是性病::法院以便輸出WHICH槽。
喜歡的東西:
#define BIND(c_slot, cxx_target) c_slot = & Generate<
decltype(c_slot)
, decltype(&cxx_target)
, &cxx_target
, #c_slot
>::call;
但我無法弄清楚如何使它發揮作用。
有沒有辦法做到這一點?
編輯:一個可能的辦法是有:
static std::map<void*, std::string> names_map;
:
#define BIND(c_slot, cxx_target) \
c_slot = & Generate< decltype(c_slot) ,decltype(&cxx_target), &cxx_target >::call; \
names_map[offset_of(&cxx_target)] = std::string(#c_slot);
:
template <STUFF>
struct Generate<STUFF>
{
static R call(STUFF)
{
COUT("SLOT: " << names_map[offset_of(???)]);
...有沒有辦法讓工作?
編輯:這已經解決here
字符串常量不能做模板a因此你必須使用一些二進制遞歸宏將它分成合理數量的字符。 – Columbo