使用模板参数编译时间码扩展
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>1
是 vector<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;
}
我完全不希望这成为一项功能,但我想我不妨问一下;是否可以在编译时使用模板参数扩展代码?
例如:
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>1
是 vector<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;
}