我有类似的东西:
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
可能有两个proc
s,一个用于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) 我正在尝试编写一个与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)
然而,似乎不太理想,因为之前,这将只会要求Container
有begin
,end …
我有十几个函数,它们有两个参数:泛型和特定类型.例如:
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) 鉴于:
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) 我想看一个函数运行多长时间.在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))
,或者如果它返回一个缺点或东西所花费的时间.
在图论中,最小距离(Dijkstra算法找到的)和最小路径(我不确定它是什么)之间的区别是什么?
sorted
如果列表按O(n)运行排序,给定一个函数返回True ,你会如何描述这种运行时间:
def sort(l):
while not sorted(l): random.shuffle(l)
Run Code Online (Sandbox Code Playgroud)
假设洗牌是完全随机的.
这会用big-O表示法写吗?或者是否有其他方法使用随机组件对算法进行分类?
当我执行以下操作时会发生什么?
(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是否这样做?)
在IP封装中甚至有IP 标准.这里的用例是什么?我可以理解像TCP over DNS这样的东西,其中IP可能不可用,但如果你可以在IP中做IP,你不能简单地做常规IP吗?