相关疑难解决方法(0)

函数作为模板参数传递

我正在寻找涉及将C++模板函数作为参数传递的规则.

这得到了C++的支持,如下例所示:

#include <iostream>

void add1(int &v)
{
  v+=1;
}

void add2(int &v)
{
  v+=2;
}

template <void (*T)(int &)>
void doOperation()
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

int main()
{
  doOperation<add1>();
  doOperation<add2>();
}
Run Code Online (Sandbox Code Playgroud)

然而,了解这种技术很困难.谷歌搜索"作为模板参数的功能"不会导致太多.令人惊讶的是,经典的C++模板完整指南也没有讨论它(至少不是我的搜索).

我的问题是这是否是有效的C++(或者只是一些广泛支持的扩展).

另外,在这种模板调用过程中,有没有办法允许具有相同签名的仿函数与显式函数互换使用?

以下就不能在上面的程序中工作,至少在视觉C++,因为语法显然是错误的.能够为仿函数切换函数是很好的,反之亦然,类似于如果要定义自定义比较操作,可以将函数指针或函子传递给std :: sort算法.

   struct add3 {
      void operator() (int &v) {v+=3;}
   };
...

    doOperation<add3>();
Run Code Online (Sandbox Code Playgroud)

指向一个或两个Web链接的指针,或C++模板书中的页面将不胜感激!

c++ templates code-generation functor

216
推荐指数
4
解决办法
18万
查看次数

根据字符串大小排序字符串向量

我想知道如何对字符串向量进行排序,使得字符数量最少的字符串位于向量之上.例如,如果向量具有ABCD,ABCDE,ABC.ABC达到顶峰.我有兴趣知道如何用sort_if实现这一点以及谓词会是什么样子?任何其他方法也欢迎

c++ stl vector

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

Visual C++〜不内联简单的const函数指针调用

亲爱的StackOverflowers,

我在Microsoft Visual Studio C++ 2012上编写了一段简单的代码:

int add(int x, int y)
{
    return x + y;
}

typedef int (*func_t)(int, int);

class A
{
public:
    const static func_t FP;
};

const func_t A::FP = &add;

int main()
{
 int x = 3;
 int y = 2;
 int z = A::FP(x, y);
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器生成以下代码:

int main()
{
000000013FBA2430  sub         rsp,28h  
int x = 3;
int y = 2;
int z = A::FP(x, y);
000000013FBA2434  mov         edx,2  
000000013FBA2439  lea         ecx,[rdx+1] …
Run Code Online (Sandbox Code Playgroud)

c++ function-pointers

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

我可以坚持GCC通过存储的函数指针内联延迟调用吗?

当然,当在该范围(ref)中直接知道内部函数调用时,C++编译器可以内联函数模板中的函数调用.

#include <iostream>

void holyheck()
{
   std::cout << "!\n";
}

template <typename F>
void bar(F foo)
{
   foo();
}

int main()
{
   bar(holyheck);
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我传入holyheck一个类,它存储函数指针(或等效的),然后调用它?我有希望得到内联吗?怎么样?

template <typename F>
struct Foo
{
   Foo(F f) : f(f) {};
   void calledLater() { f(); }

private:
   F f;
};

void sendMonkeys();
void sendTissues();

int main()
{
   Foo<void(*)()> f(sendMonkeys);
   Foo<void(*)()> g(sendTissues);
   // lots of interaction with f and g, not shown here
   f.calledLater();
   g.calledLater();
}
Run Code Online (Sandbox Code Playgroud)

我的类型Foo旨在隔离大量的逻辑; 它将被实例化几次.调用的特定函数calledLater是实例化之间唯一不同的东西(尽管它在a的生命周期中永远不会改变 …

c++ c++03

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

防止Visual C++内联函数

我用c ++写了一个简单的程序:

#include <stdio.h>

const signed char pass[] = "\x70\x61\x73\x73\x77\x6F\x72\x64";

bool __stdcall check_password(const signed char * str)
{
    unsigned int i;
    for(i=0;i<8;++i)
        if(str[i]!=pass[i])
            return false;
    return true;
}

int main(int argc, char * argv[])
{
    signed char buf[20];
    printf("please enter the password: ");
    scanf("%s",buf);
    printf((check_password(buf)) ? "correct!\n" : "incorrect.\nPress any key to exit..\n");
    getchar();
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)


并使用visual studio express 2010编译它.
我在OllyDbg中打开了结果,这就是我所看到的:

Address   Hex dump            Command                                          Comments
00FF1011  ³.  8B35 A020FF00   MOV ESI,DWORD PTR DS:[<&MSVCR100.printf>]
00FF1017  ³.  68 0021FF00     PUSH …
Run Code Online (Sandbox Code Playgroud)

c++ assembly compiler-optimization ollydbg dll-injection

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