C++ Rcpp:构造模板函数
我有以下的MWE。它包含一个包含两个成员的类,一个整数和一个字符串。首先使用函数C++ Rcpp:构造模板函数,c++,rcpp,C++,Rcpp,我有以下的MWE。它包含一个包含两个成员的类,一个整数和一个字符串。首先使用函数创建类的对象并返回指向该对象的指针。在second_int和second_str中,我输出两个成员 考虑到second\u int和second\u str具有或多或少相同的功能,对我来说,对它们进行模板化似乎是显而易见的。鉴于我的MWE,这是否可能在Rcpp内实现 class C{ public: std::vector<int> i_vec; std::vector<std::strin
创建类的对象并返回指向该对象的指针。在second_int
和second_str
中,我输出两个成员
考虑到second\u int
和second\u str
具有或多或少相同的功能,对我来说,对它们进行模板化似乎是显而易见的。鉴于我的MWE,这是否可能在Rcpp内实现
class C{
public:
std::vector<int> i_vec;
std::vector<std::string> s_vec;
C(){
i_vec.push_back(0);
s_vec.push_back("R");
}
};
// [[Rcpp::export]]
XPtr<C> first()
{
XPtr<C> p(new C, true);
return(p);
}
// [[Rcpp::export]]
void second_int(XPtr<C> p)
{
Rcout << p->i_vec[0] << "\n";
}
// [[Rcpp::export]]
void second_str(XPtr<C> p)
{
Rcout << p->s_vec[0] << "\n";
}
C类{
公众:
std::向量i_vec;
std::向量s_-vec;
C(){
i_vec.推回(0);
s_vec.推回(“R”);
}
};
//[[Rcpp::导出]]
xptrfirst()
{
xptrp(新C,真);
回报率(p);
}
//[[Rcpp::导出]]
无效第二个整数(XPtr p)
{
RcOUT IYVEC(0)模板不能直接在这里使用,但我们可以用它来完成我认为你想要的!让我们考虑一下你所写的东西和你想直接写的东西。
你有:
// [[Rcpp::export]]
void second_int(XPtr<C> p)
{
Rcout << p->i_vec[0] << "\n";
}
// [[Rcpp::export]]
void second_str(XPtr<C> p)
{
Rcout << p->s_vec[0] << "\n";
}
/[[Rcpp::export]]
无效第二个整数(XPtr p)
{
Rcout i_vec[0]这些函数看起来很相似……从外部看,但从内部看,它们做的是两件截然不同的事情。任何将它们合并为一个函数的尝试都注定会失败。我建议您要么保持原样,要么在它们操作的向量类型上参数化函数;即传入一个向量而不是指向CW的指针。您为什么要这样做要对它们进行模板化。它们的输入/输出是相同的:void
和XPtr
。它们是两个不同的函数。此代码听起来正确。
// [[Rcpp::export]]
template< membername member_to_extract >
void second(XPtr<C> p)
{
Rcout << p->member_to_extract[0] << "\n";
}
/**
* we would like to call it like this:
* second<i_vec>(p) (to get the int value)
* second<s_vec>(p) (to get the str value)
*/
// generic template. We need something that fails to compile
// so that second<int> and second<std::string> are the only
// specializations the compiler will allow us to use.
template< typename T >
void second(XPtr<C> p)
{
static_assert(false, "second can't be used with this type.");
}
template< >
void second<int>(XPtr<C> p)
{
Rcout << p->i_vec[0] << "\n";
}
template< >
void second<std::string>(XPtr<C> p)
{
Rcout << p->s_vec[0] << "\n";
}