小编ret*_*998的帖子

如何使用模板将lambda转换为std :: function

基本上,我希望能够做的是使用任意数量的任何类型的参数lambda并将其转换为std :: function.我尝试过以下方法,两种方法都不起作用.

std::function([](){});//Complains that std::function is missing template parameters
template <typename T> void foo(function<T> f){}
foo([](){});//Complains that it cannot find a matching candidate
Run Code Online (Sandbox Code Playgroud)

但是,下面的代码确实有效,但它不是我想要的,因为它需要明确说明对通用代码不起作用的模板参数.

std::function<void()>([](){});
Run Code Online (Sandbox Code Playgroud)

我整个晚上一直在使用功能和模板,我只是想不出来,所以任何帮助都会非常感激.

正如评论中所提到的,我试图这样做的原因是因为我试图使用可变参数模板在C++中实现currying.不幸的是,这在使用lambdas时非常糟糕.例如,我可以使用函数指针传递标准函数.

template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
    foo(bar);
}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何将lambda传递给这样的可变函数.为什么我对将泛型lambda转换为std :: function感兴趣是因为我可以执行以下操作,但最终要求我明确地将模板参数声明为std :: function,这正是我想要避免的.

template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
    foo(std::function<void()>([](){}));
}
Run Code Online (Sandbox Code Playgroud)

c++ lambda templates function c++11

62
推荐指数
4
解决办法
3万
查看次数

由于memcpy,C++ ifstream :: read很慢

最近我决定优化我正在做的一些文件读取,因为正如大家所说,将大量数据读取到缓冲区然后使用它比使用大量小读取更快.而且我的代码现在肯定要快得多,但在进行一些分析之后,似乎memcpy占用了大量的时间.

我的代码的要点是......

ifstream file("some huge file");
char buffer[0x1000000];
for (yada yada) {
    int size = some arbitrary size usually around a megabyte;
    file.read(buffer, size);
    //Do stuff with buffer
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Visual Studio 11,在对我的代码进行分析后,它ifstream::read()最终会调用xsgetn()从内部缓冲区到我的缓冲区的副本.此操作占用超过80%的时间!排在第二位的是uflow()10%的时间.

有什么方法可以绕过这个复制吗?我可以以某种方式告诉我ifstream将我需要的大小缓冲到我的缓冲区吗?C风格FILE*也使用这样的内部缓冲区吗?

更新:由于人们告诉我使用cstdio ...我做了一个基准测试.

编辑:不幸的是旧的代码充满了失败(它甚至没有读取整个文件!).你可以在这里看到它:http://pastebin.com/4dGEQ6S7

这是我的新基准:

const int MAX = 0x10000;
char buf[MAX];
string fpath = "largefile";
int main() {
    {
        clock_t start = clock();
        ifstream file(fpath, ios::binary);
        while (!file.eof()) {
            file.read(buf, MAX);
        }
        clock_t end …
Run Code Online (Sandbox Code Playgroud)

c++ performance fstream memcpy visual-c++

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

在C++中将64位值向左移64位会产生奇怪的结果

可能重复:
64位移位问题

我在Windows 8 64位上使用Visual Studio 2012,在调试模式下使用AMD Phenom II定位x64.
基本上......

uint64_t Foo = 0xFFFFFFFFFFFFFFFF << 64;//Foo is now 0x0000000000000000
uint64_t Derp = 64;
uint64_t Bar = 0xFFFFFFFFFFFFFFFF << Derp;//Foo is now 0xFFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)

使用较低的值(如63)可恢复正常行为.
为什么会发生这种情况,我该如何解决这个问题呢?

更新:我切换到发布模式.瞧,问题消失了,两者都返回了0.但问题仍然是调试模式,这是我需要调试代码的地方.

c++ 64-bit bit-manipulation shift

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