Обновление: Отредактированный ответ на основе комментариев. Теперь вызывает BOOST_EXPORT_CLASS
макрос вместо функции macro()
, которую я определил. Я не тестировал это с помощью BOOST_EXPORT_CLASS
, однако я сделал симуляцию, обратившись к типу Foo<...>
на каждом уровне расширения шаблона. Мне удалось получить доступ к каждому из разных типов для разных расширений, поэтому я предполагаю, что все, что BOOST_EXPORT_CLASS
должно работать.
Я думаю, что это сейчас делает то, что вы хотите:
#define BAR(...) Foo<__VA_ARGS__>()
// Variadic definition of Foo
template <typename... Args>
struct Foo;
// Specialize Foo for the case that there is at least on template parameter
template <typename Arg, typename... Args>
struct Foo<Arg, Args...> : Foo<Args...> {
using type = Foo<Arg, Args...>;
Foo() : Foo<Args...>(){
BOOST_EXPORT_CLASS(type)
}
};
// Terminating case for Foo
template <>
struct Foo<> {
using type = Foo<>;
Foo() { BOOST_EXPORT_CLASS(type) }
};
int main() {
BAR(int, float, double);
}
Чтобы проверить, что это теоретически должно работать, я определил следующий макрос:
#define MACRO(x) test<x>();
И заменил BOOST_EXPORT_CLASS(type)
с MACRO(type)
. Функция test
заключается в следующем:
template <typename T>
void test() {
std::cout << typeid(T).name() << "\n";
}
Запуск код печатается следующее (я добавил комментарии), который показывает, что шаблоны разлагаются в макро и должен появиться BOOST_EXPORT_CLASS
как показано в вопросе :
3FooIJEE // Foo<>
3FooIJdEE // Foo<double>
3FooIJfdEE // Foo<float, double>
3FooIJifdEE // Foo<int, float, double>
Вот живой демо-кода Live Demo.
Одна вещь, чтобы отметить, что расширение находится в противоположном направлении к тому, что указано ОП, то есть:
Macro(Foo<>)
Macro(Foo<double>)
Macro(Foo<float, double>)
Macro(Foo<int, float, double>)
Это возможно точно, но это серьезно звучит как [XY Проблема] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) , – Rumburak
Являются ли макросы 'Bar' и' Macro' разными? И вы хотите, чтобы макрос «Макро» вызывался для каждого расширения вызова вариационного шаблона? – RobClucas
Спасибо за ваш совет. Хотя я полностью не согласен с вами, но я изменил вопрос, чтобы избежать проблемы с XY. – MohsenTamiz