小编Cla*_*diu的帖子

当唯一的区别是参数的常量时,是否可以将两个模板函数编写为一个?

我有类似的东西:

template <class Foob, class T>
void do_it(Foob& f, T& t) { f.proc(t); }

template <class Foob, class T>
void do_it(Foob& f, const T& t) { f.proc(t); }
Run Code Online (Sandbox Code Playgroud)

有些人Foob需要const T&s而其他人Foob只需要T&s,或者同样Foob可能有两个procs,一个用于const案例,一个用于非const案例,用于做不同的事情.

但是,代码do_it是一样的:它只是f.proc(t).有时代码是多行,但仍然相同.有没有办法只写do_it一个函数?像这样的东西,虽然这显然不起作用:

template <class Foob, class MaybeConst, class T>
void do_it(Foob& f, MaybeConst T& t) { f.proc(t); }
Run Code Online (Sandbox Code Playgroud)

c++ templates const

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

在不知道参数类型的情况下否定lambda?

我正在尝试编写一个与Python的过滤器类似的就地过滤器功能.例如:

std::vector<int> x = {1, 2, 3, 4, 5};
filter_ip(x, [](const int& i) { return i >= 3; });
// x is now {3, 4, 5}
Run Code Online (Sandbox Code Playgroud)

首先我尝试了这个:

template <typename Container, typename Filter>
void filter_ip(Container& c, Filter&& f)
{
  c.erase(std::remove_if(c.begin(), c.end(), std::not1(f)), c.end());
}
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用,因为lambdas 没有argument_type字段.

以下变体确实有效:

template <typename Container, typename Filter>
void filter_ip(Container& c, Filter&& f)
{
  c.erase(std::remove_if(c.begin(), c.end(), 
                         [&f](const typename Container::value_type& x) { 
                            return !f(x); 
                         }), 
          c.end());
}
Run Code Online (Sandbox Code Playgroud)

然而,似乎不太理想,因为之前,这将只会要求Containerbegin,end …

c++ lambda templates types c++11

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

是否有通用的方法来消除SFINAE的decltype条件?

我有十几个函数,它们有两个参数:泛型和特定类型.例如:

template <class A, class B>
void foo(A& a, B& b)
{
    cout << "generic fallback" << endl;
}

template <class A>
void foo(A& a, int &i)
{
    cout << "generic int" << endl;
}

template <class A>
void foo(A& a, string& s)
{
    cout << "generic str" << endl;
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个重载,只要A是特定结构的实例[1] 就会调用它.到目前为止我想出的最好的是:

struct mine
{
    int is_special;
};

template <class A, class B>
auto foo(A& a, B& b) -> decltype(A::is_special, void())
{
    cout << "specialized fallback" << …
Run Code Online (Sandbox Code Playgroud)

c++ generics templates sfinae c++11

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

什么决定了临时工的生命周期何时扩展到const引用或rvalue引用?

鉴于:

struct hurg { ... };

hurg get_hurg() { return hurg(); }
hurg&& get_mhurg() { return hurg(); }
Run Code Online (Sandbox Code Playgroud)

我的理解和实验表明,以下不是未定义的行为(编辑:感谢答案,结果我错了,get_mhurg()示例未定义的行为):

{
    const hurg& a = get_hurg(); 
    hurg&& b = get_hurg();
    const hurg& c = get_mhurg(); 
    hurg&& d = get_mhurg();
    // do stuff with a, b, c, d
}
// a, b, c, d are now destructed
Run Code Online (Sandbox Code Playgroud)

也就是说,临时的寿命hurg对象返回通过get_hurg()get_mhurg()延伸直至范围的端部.

但是,在(函数从这里)的情况下:

template <typename T>
auto id(T&& x) -> …
Run Code Online (Sandbox Code Playgroud)

c++ reference lifetime rvalue-reference c++11

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

PLT方案中的时间码

我想看一个函数运行多长时间.在PLT-Scheme中最简单的方法是什么?理想情况下,我希望能够做到这样的事情:

> (define (loopy times)
  (if (zero? times)
      0
      (loopy (sub1 times)))) 
> (loopy 5000000)
0                      ;(after about a second)
> (timed (loopy 5000000))
Took: 0.93 seconds
0
> 
Run Code Online (Sandbox Code Playgroud)

这不要紧,如果我不得不使用一些其他类似语法(timed loopy 5000000)或者(timed '(loopy 5000000)),或者如果它返回一个缺点或东西所花费的时间.

time scheme timing racket

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

图表中的最小路径是什么?

在图论中,最小距离(Dijkstra算法找到的)和最小路径(我不确定它是什么)之间的区别是什么?

language-agnostic algorithm graph-theory shortest-path

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

随机排序的运行时间

sorted如果列表按O(n)运行排序,给定一个函数返回True ,你会如何描述这种运行时间:

def sort(l):
    while not sorted(l): random.shuffle(l)
Run Code Online (Sandbox Code Playgroud)

假设洗牌是完全随机的.

这会用big-O表示法写吗?或者是否有其他方法使用随机组件对算法进行分类?

language-agnostic sorting random algorithm list

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

计算中的Curried函数的实现

当我执行以下操作时会发生什么?

(define ((func x) y)
    (if (zero? y)
        ((func x) 1)
        12))
Run Code Online (Sandbox Code Playgroud)

我明白我可以这样做:

(define curried (func 5))
Run Code Online (Sandbox Code Playgroud)

而现在我可以使用咖喱.我很好奇的是函数的定义.是行吗?

((func x) 1)
Run Code Online (Sandbox Code Playgroud)

用x作为参数创建一个新的lambda,然后在1上调用它?或者它比那更聪明,它只是重新使用现有的.(例如,如果我这样做(curried 0),该((func x) 1)行将等同于(curried 1)- PLAI Scheme是否这样做?)

scheme programming-languages currying racket

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

IP-in-IP的必要性是什么?

在IP封装中甚至有IP 标准.这里的用例是什么?我可以理解像TCP over DNS这样的东西,其中IP可能不可用,但如果你可以在IP中做IP,你不能简单地做常规IP吗?

language-agnostic networking ip-protocol

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

如何在Scheme中检查NaN?

还有一个地方我可以在Scheme中查找所有浮点操作吗?

scheme

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