我完全相信这不是一个特色,但我想也可以问;是否可以使用模板参数在编译时扩展代码?
例如:
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类这样的东西也很有用,它也可以通过递归来实现,但不是那么整齐。
感谢您的帮助!
答案 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>1
为vector<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;
}