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

时间:2018-06-09 22:51:51

标签: c++11 templates constexpr expansion

我完全相信这不是一个特色,但我想也可以问;是否可以使用模板参数在编译时扩展代码?

例如:

library(RSelenium)
rD <- rsDriver()
remDr <- rD[["client"]]
remDr$navigate(paste0("file://", tmp))
# Find and populate the field
webElem <- remDr$findElement(using = "id", "form_Name")
webElem$sendKeysToElement(list("Foo Bar"))
# Close browser
remDr$close()

其中......被template <size I> void foo() { ...double... vec; } std::vector< >次替换。

所以I会编译为:

foo<2>()

我甚至无法想象这将是什么语法,所以我没有希望。

对于像N维binning类这样的东西也很有用,它也可以通过递归来实现,但不是那么整齐。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

是的,你可以。您可以使用类模板和专门化来完成此操作,如下所示:

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

答案 1 :(得分:0)

  

是否可以使用模板参数在编译时扩展代码?

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

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

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