C++ Rcpp:构造模板函数

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

我有以下的MWE。它包含一个包含两个成员的类,一个整数和一个字符串。首先使用函数
创建类的对象并返回指向该对象的指针。在
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";
}