Макрорасширение не работает, как расширение пакета аргументов с вариативными шаблонами. То, что у вас есть, будет расширяться до:
X,Y::do();
И не
X::do(); Y::do();
Как вы надеялись. Но в C ++ 11 вы можете использовать вариативные шаблоны. Например, вы могли бы сделать то, что хотите, таким образом:
#include
struct X { static void foo() { std::cout << "X::foo()" << std::endl; }; };
struct Y { static void foo() { std::cout << "Y::foo()" << std::endl; }; };
struct Z { static void foo() { std::cout << "Z::foo()" << std::endl; }; };
int main()
{
do_foo();
}
Все, что вам нужно, это (относительно простая) техника:
namespace detail
{
template
struct do_foo;
template
struct do_foo
{
static void call()
{
T::foo();
do_foo::call();
}
};
template
struct do_foo
{
static void call()
{
T::foo();
}
};
}
template
void do_foo()
{
detail::do_foo::call();
}
Вот live пример .