小编Mis*_*cha的帖子

以自然(非反向)顺序将func应用于std :: tuple中的元素

我需要为任意元组中的每个元素调用 - template或overloaded函数.确切地说,我需要在元组中指定元素,因为它们在元组中指定.

例如.我有一个元组std::tuple<int, float> t{1, 2.0f};和一个功能

class Lambda{
public: 
   template<class T>
   void operator()(T arg){ std::cout << arg << "; "; }
};
Run Code Online (Sandbox Code Playgroud)

我需要一些结构/函数Apply,如果调用它Apply<Lambda, int, float>()(Lambda(), t)会产生:

1; 2.0f; 
Run Code Online (Sandbox Code Playgroud)

而不是2.0f; 1;.

请注意,我知道解决方案,如果将"原始"参数包传递给函数,并且我知道如何以相反的顺序对元组执行此操作.但是以下部分特化的尝试Apply失败了:

template<class Func, size_t index, class ...Components>
class ForwardsApplicator{
public:
    void operator()(Func func, const std::tuple<Components...>& t){
        func(std::get<index>(t));
        ForwardsApplicator<Func, index + 1, Components...>()(func, t);
    }
};

template<class Func, class... Components>
class ForwardsApplicator < Func, sizeof...(Components), Components... > {
public:
    void …
Run Code Online (Sandbox Code Playgroud)

c++ functional-programming c++11 stdtuple

7
推荐指数
2
解决办法
297
查看次数

从Iterator <T>转换为Iterator <U>,其中T是U的子类

给定一个类T的子类U,是否可以安全地转换Iterator<T>Iterator<U>?并且假设演员阵容是安全的,除了以下方面之外,还有更优雅(并且没有警告)的方式:

Iterator<T> it = <insert your Iterator<T> here...>;
Iterator<U> it2 = (Iterator<U>)(Iterator<? extends U>)it;
Run Code Online (Sandbox Code Playgroud)

演员为什么不危险的原因是:

  1. Iterator<?>不支持插入元素,因此不存在使用Iterator<U>而不是损坏底层数据结构的危险Iterator<T>;
  2. Consumer<? super U>是可转换的,Consumer<? super T>但反之亦然.因此,Iterator<U>::forEachRemaining(Consumer<? super U> action)将接受符合相同方法的所有动作的子集,Iterator<T>并且特别是不引入执行不支持的动作的方式Iterator<T>;
  3. Iterator<U>::remove()相当于Iterator<T>::remove();
  4. Iterator<U>::next() 返回T的超类;

java generics

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

标签 统计

c++ ×1

c++11 ×1

functional-programming ×1

generics ×1

java ×1

stdtuple ×1