Компиляция расширения временного кода с использованием параметров шаблона - PullRequest
0 голосов
/ 10 июня 2018

Я полностью ожидаю, что это не будет особенность, но решил, что я могу также спросить;Можно ли расширить код во время компиляции, используя параметры шаблона?

Например:

template <size I>
void foo()
{
    ...double... vec;
}

Где ... заменяется на std::vector< >, I раз.

Так что foo<2>() будет компилироваться в:

void foo()
{
   std::vector<std::vector<double>> vec;
}

Я даже не представляю, какой будет синтаксис для этого, так что я не надеюсь.

Это будетбыть полезным для чего-то вроде N-мерного класса биннинга, который также может быть реализован с помощью рекурсии, но не настолько аккуратно, imo.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

возможно ли расширить код во время компиляции, используя параметры шаблона?

Непосредственно ... Я так не думаю.

Но я полагаю, вы можетереализовать специфические черты типа следующим образом

template <typename T, std::size_t I>
struct bar
 { using type = std::vector<typename bar<T, I-1U>::type>; };

template <typename T>
struct bar<T, 0U>
 { using type = T; };

и использовать в foo() таким образом

template <std::size_t I>
void foo ()
 {
   typename bar<double, I>::type  vec;
 }

Если вы хотите быть немного более универсальным, вы также можете передать std::vector как параметр шаблона-шаблона;если вы определите bar следующим образом

template <template <typename...> class C, typename T, std::size_t I>
struct bar
 { using type = C<typename bar<C, T, I-1U>::type>; };

template <template <typename ...> class C, typename T>
struct bar<C, T, 0U>
 { using type = T; };

foo() станет

template <std::size_t I>
void foo ()
 {
   typename bar<std::vector, double, I>::type  vec;
 }
0 голосов
/ 10 июня 2018

Да, вы можете.Это можно сделать с помощью шаблонов классов и специализаций, например:

template<std::size_t N>
struct MultiDim {
    using underlying = typename MultiDim<N-1>::type;
    using type = std::vector<underlying>;
};
template<>
struct MultiDim<1> {
    using type = std::vector<double>;
};
template<std::size_t N>
using multi_dimensional = typename MultiDim<N>::type;

Следовательно, multi_dimensional<1> равно vector<double> и multi_dimensional<N>, где N>1 равно vector<multi_dimensional<N-1>>.

...