Немного другой синтаксис, но ...
#include <boost/preprocessor.hpp>
#include <iostream>
void f1(int x, int y, char* z) { std::cout << "::f1(int,int,char*)\n"; }
#define GENERATE_ARG(z,n,unused) BOOST_PP_CAT(arg,n)
#define GET_ARGS(n) BOOST_PP_ENUM(n, GENERATE_ARG, ~)
#define GENERATE_PARAM(z,n,seq) BOOST_PP_SEQ_ELEM(n,seq) GENERATE_ARG(z,n,~)
#define GENERATE_PARAMS(seq) BOOST_PP_ENUM( BOOST_PP_SEQ_SIZE(seq), GENERATE_PARAM, seq )
#define PASSTHROUGH(Classname, Function, ArgTypeSeq) \
void Classname::Function( GENERATE_PARAMS(ArgTypeSeq) ) \
{ \
::Function( GET_ARGS( BOOST_PP_SEQ_SIZE(ArgTypeSeq) ) ); \
}
struct test
{
void f1(int,int,char*);
};
PASSTHROUGH(test,f1,(int)(int)(char*))
int main()
{
test().f1(5,5,0);
std::cin.get();
}
Вы могли бы получить что-то ближе к своему, если бы использовали кортежи, но вам нужно было бы указать количество аргументов для базовой функции (вы не можетеполучить размер из кортежа).Вроде как так:
PASSTHROUGH(test,f1,3,(int,int,char*))
Это то, что вы ищете?Я знал, что это можно сделать;Потребовалось около получаса, чтобы решить.Вы, кажется, ожидаете, что есть неявное «это», от которого нужно избавиться, но я не понимаю, почему ... поэтому, возможно, я неправильно понимаю проблему.Во всяком случае, это позволит вам быстро выполнять «проходные» функции-члены по умолчанию, которые относятся к какой-то глобальной функции.Вам понадобится DECPASSTHROUGH для объявления класса, если вы хотите пропустить необходимость объявить их все ... или вы можете изменить это, чтобы сделать встроенные функции.
Подсказка: используйте BOOST_PP_STRINGIZE ((XX)) для проверкивывод метафункций препроцессора.