使用模板参数编译时间码扩展

Compile time code expansion using template parameters

我完全不希望这成为一项功能,但我想我不妨问一下;是否可以在编译时使用模板参数扩展代码?

例如:

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

其中...被替换为 std::vector< >I 次。

因此 foo<2>() 将编译为:

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

我什至无法想象它的语法是什么,所以我不抱希望。

它对于 N 维分箱之类的东西很有用 class,它也可以通过递归实现,但我觉得不是那么巧妙。

是的,你可以。您可以使用 class 模板和专业化来做到这一点,如下所示:

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>1vector<multi_dimensional<N-1>>

is it possible to expand code at compile time using template parameters?

直接...我不这么认为。

但我想您可以按如下方式实现特定类型特征

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;
 }