小编Tas*_*kie的帖子

Variadic可变参数模板模板参数

是否有一种直接的方法来获得可变参数的可变参数模板模板参数.例如,考虑以下函数签名

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

7
推荐指数
1
解决办法
1112
查看次数

表达式模板不适用于clang下的基本类型重载

我有一个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)

c++ expression-templates c++11

4
推荐指数
1
解决办法
181
查看次数

调用variadic类型的静态constexpr数组时未定义的引用

我有以下课程

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对象,我想确定它们在每个维度中是否相等.

c++ c++11

1
推荐指数
1
解决办法
280
查看次数

找到唯一向量的索引和逆映射

我有一个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)

c++ performance stl c++11

1
推荐指数
1
解决办法
129
查看次数