Обновление: отредактированный ответ на основе комментариев. Теперь вызывает макрос 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>
Вот живая демонстрация кода Живая демонстрация.
Следует отметить, что расширение идет в направлении, противоположном указанному в OP, то есть:
Macro(Foo<>)
Macro(Foo<double>)
Macro(Foo<float, double>)
Macro(Foo<int, float, double>)
person
RobClucas
schedule
27.01.2016
Bar
иMacro
разными макросами? И вы хотите, чтобы макросMacro
вызывался для каждого расширения вызова вариативного шаблона? - person RobClucas   schedule 27.01.2016Macro
должен вызываться для каждой версии. - person motam   schedule 27.01.2016