是否有一种直接的方法来获得可变参数的可变参数模板模板参数.例如,考虑以下函数签名
template<template<typename,size_t...> class Pack,
typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);
Run Code Online (Sandbox Code Playgroud)
如果我们想要传递两个Packs,我们现在必须做一个重载
template<template<typename,size_t...> class Pack,
typename T, size_t ... Args0, size_t ... Args1>
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b);
Run Code Online (Sandbox Code Playgroud)
现在如果我们想要传递Pack具有不同可变参数的可变数量的对象,例如Args0...,Args1...,Args2....
所以我在想是否有一种切实可行的做法(以下是草图表示).
template<template<typename,size_t...> ... class Pack, typename T,...>
void foo(const Pack<T,...> ... packs);
Run Code Online (Sandbox Code Playgroud) c++ variadic-functions template-templates variadic-templates c++11
我有一个CRTP基类如下:
template<typename Derived, size_t DIMS>
class Base {
public:
// here is I think where the problem is
inline const Derived& self() const {return *static_cast<const Derived*>(this);}
};
Run Code Online (Sandbox Code Playgroud)
然后将派生类定义为
template<typename T, size_t ... Rest>
class Derived: public Base<Derived<T,Rest...>,sizeof...(Rest)> {
public:
Derived() = default;
// This constructor binds any arbitrary expression to Derived
template<typename Expr, size_t DIMS>
inline Derived(const Base<Expr,DIMS>& src_) {
const Expr &src = src_.self();
print(src.rhs);
}
};
Run Code Online (Sandbox Code Playgroud)
考虑到我自己的运算符,我也有以下AddOperator也继承自base
template<typename TLhs, typename TRhs, size_t DIMS>
struct …Run Code Online (Sandbox Code Playgroud) 我有以下课程
template<int ... Args>
struct foo {
constexpr static int arr[sizeof...(Args)]={Args...};
constexpr int dimension(int i) {return arr[i];}
};
Run Code Online (Sandbox Code Playgroud)
但我undefined reference to arr在打电话的时候得到了dimension.如果我arr在函数内部移动,dimension那么函数就不再是函数constexpr,因为它需要在函数体内有两个分号.例如,我做不到
constexpr int a = foo_obj.dimension(2);
Run Code Online (Sandbox Code Playgroud)
我的目标是以元编程方式迭代varidic模板的所有维度并将其与另一个整数进行比较?理想情况下,如果我有两个foo对象,我想确定它们在每个维度中是否相等.
我有一个std::vector<int>重复的值.我可以使用std::unique()和找到唯一值std::vector::erase(),但是如何通过逆映射向量有效地找到索引的向量并构造给定唯一值向量的原始向量.请允许我用一个例子来说明这一点:
std::vector<int> vec = {3, 2, 3, 3, 6, 5, 5, 6, 2, 6};
std::vector<int> uvec = {3, 2, 6, 5}; // vector of unique values
std::vector<int> idx_vec = {0, 1, 4, 5}; // vector of indices
std::vector<int> inv_vec = {0, 1, 0, 0, 2, 3, 3, 2, 1, 2}; // inverse mapping
Run Code Online (Sandbox Code Playgroud)
逆映射向量使得利用其索引可以使用唯一向量即构造原始向量
std::vector<int> orig_vec(ivec.size()); // construct the original vector
std::for_each(ivec.begin(), ivec.end(),
[&uvec,&inv_vec,&orig_vec](int idx) {orig_vec[idx] = uvec[inv_vec[idx]];});
Run Code Online (Sandbox Code Playgroud)
并且索引向量仅仅是原始向量中第一次出现唯一值的向量索引.
我的基本解决方案远没有效率.它不使用STL算法O(n^2),最糟糕的是.
template <typename …Run Code Online (Sandbox Code Playgroud)