C++ 98に固執する必要がある場合、通常のイディオムは整数テンプレートパラメータを使用してthe different SEXPTYPE
sを表すことです。あなたは一般的にこれらの5を有する唯一の懸念しているRcpp::*Vector
(またはRcpp::*Matrix
)を扱う場合:
# Integer Value SEXPTYPE R Vector Rcpp Vector
# 10 LGLSXP logical LogicalVector
# 13 INTSXP integer IntegerVector
# 14 REALSXP numeric NumericVector
# 15 CPLXSXP complex ComplexVector
# 16 STRSXP character CharacterVector
これを行った、Rcpp::traits
名前空間で一般的に必要な変換のための標準的なメタプログラミングツールがあります
SEXPTYPE
- >POD¹タイプ:storage_type
Rcpp::traits::storage_type<REALSXP>::type
- >double
Rcpp::traits::storage_type<INTSXP>::type
- >int
- 等
- POD¹タイプ - >
SEXPTYPE
:r_sexptype_traits
Rcpp::traits::r_sexptype_traits<double>::rtype
- > 14(REALSXP
)
Rcpp::traits::r_sexptype_traits<int>::rtype
- > 13(INTSXP
)
- など。
storage_type<STRSXP>::type
収率SEXP
(具体的には、CHARSXP
)を¹、及びPOD型技術ながら、それはその原子単位が不透明ポインタ(SEXP
)であることを他の単純なベクトル型とは異なり、ありません、例えばconst char*
またはstd::string
が必要です。
つまらない例は、簡潔のためにRCPP_RETURN_VECTOR
使用:参考
#include <Rcpp.h>
template <int RTYPE>
class MyNumVec {
public:
typedef Rcpp::Vector<RTYPE> vec_t;
typedef typename Rcpp::traits::storage_type<RTYPE>::type storage_t;
private:
const vec_t& x;
public:
MyNumVec(const vec_t& y)
: x(y)
{}
storage_t operator[](int i) const
{ return x[i]; }
operator vec_t() const
{ return x; }
};
template <int RTYPE>
Rcpp::Vector<RTYPE> get_first_elem_impl(const Rcpp::Vector<RTYPE>& vec)
{
MyNumVec<RTYPE> tmp(vec);
return Rcpp::Vector<RTYPE>::create(tmp[0]);
}
// [[Rcpp::export]]
Rcpp::RObject get_first_elem(Rcpp::RObject x) {
RCPP_RETURN_VECTOR(get_first_elem_impl, x);
}
get_first_elem(c(TRUE, TRUE, FALSE, TRUE, FALSE))
# [1] TRUE
get_first_elem(1L:5L)
# [1] 1
get_first_elem(1:5 + 0.5)
# [1] 1.5
get_first_elem(1:5 + 2i)
# [1] 1+2i
get_first_elem(letters[1:5])
# [1] "a"
を、C++ 98でこれを行う従来の方法は、下にクラスをテンプレートであります'SEXPTYPE'を使い、' Rcpp :: traits :: storage_type'を使って原子タイプを決定してください。 [たとえば](https://gist.github.com/nathan-russell/a6c154ae18d2a5cc8dcc3af06da01ea6#file-vector-template-cpp)。 – nrussell
@nurlsell代わりに要点を書くことができますか?これは 'auto'の例の実行可能な代替手段です。私はそれがそうでなければそれの混乱で失われるかもしれないことを少し恐れている。 – coatless