相关疑难解决方法(0)

如何在容器中存储具有不同签名的功能对象?

所以想象我们有2个功能(void : ( void ) ),(std::string : (int, std::string))而且我们还可以有10个功能.所有(或其中一些)采用不同的参数类型,并可以返回不同的类型.我们想将它们存储在a中std::map,因此我们得到这样的API:

//Having a functions like:
int hello_world(std::string name, const int & number )
{
    name += "!";
    std::cout << "Hello, " << name << std::endl;
    return number;
}
//and
void i_do_shadowed_stuff()
{
    return;
}

//We want to be capable to create a map (or some type with similar API) that would hold our functional objects. like so:
myMap.insert(std::pair<std::string, fun_object>("my_method_hello", hello_world) )
myMap.insert(std::pair<std::string, fun_object>("my_void_method", i_do_shadowed_stuff) )
//And …
Run Code Online (Sandbox Code Playgroud)

c++ boost

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

从宏传递到函数时避免传递 void 表达式

我想编写一个调试宏,在出现错误时打印调用的函数的名称。问题是有些函数返回值,我想从宏返回任何值。

\n

这是我的尝试:

\n
#define check(expr) _check_expr(#expr, expr)\n\nextern bool check_for_error();\n\ntemplate <typename T> inline T _check_expr(const char *str, T value)\n{\n    if (check_for_error()) {\n        fprintf(stderr, "Failure: %s\\n", str);\n    }\n\n    return value;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我遇到的问题是,有时T = void编译器不会让我将类型表达式传递void给函数:

\n
../src/render.cc: In constructor \xe2\x80\x98render::impl::impl()\xe2\x80\x99:\n../src/render.cc:34:20: error: invalid use of void expression\n   34 |     check(glDisable(GL_DEPTH_TEST));\n
Run Code Online (Sandbox Code Playgroud)\n

我无法重新定义在宏下调用的函数checkcheck_for_error函数,这些函数是我的程序外部的。此外,在计算表达式之后需要检查错误。

\n

C++中有没有好的方法来解决这个问题?

\n

类似于:“如果该表达式的 decltype 为 void,则生成此代码,否则生成该代码”。

\n

c++ metaprogramming

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

开关头中的变量声明?

在浏览我朋友的代码时,我注意到了这一点:

switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}
Run Code Online (Sandbox Code Playgroud)

交换机头中的变量是什么?他正在使用GCC,所以我认为这可能是GCC扩展.任何的想法?

c++

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

C++预处理器连接

我有一个带有函数指针的函数构建.我认为尝试与预处理器宏交换此功能可能会更快.至少,我想尝试宏,以便我可以测量它是否生成更快的代码.

它或多或少是这样的:

typedef int (Item::*GetterPtr)(void)const;
typedef void (Item::*SetterPtr)(int);

void doStuff(Item* item, GetterPtr getter, SetterPtr setter, int k)
{
    int value = (item->*getter)();

    // .. Do some stuff 

    (item->*setter)(newValue);
}
Run Code Online (Sandbox Code Playgroud)

它被称为

// ...
doStuff(&item, &Item::a, &Item::setA, _a);
doStuff(&item, &Item::b, &Item::setB, _b);
doStuff(&item, &Item::c, &Item::setC, _c);
// ...
Run Code Online (Sandbox Code Playgroud)

我认为可以用以下方式交换它:

#define DO_STUFF(item, getter, setter, k) do { \
int value = item ## -> ## getter ## (); \
//... \
item ## -> ## setter ## (newValue); \
} while(0);
Run Code Online (Sandbox Code Playgroud)

但它给了我错误,如:

错误:粘贴")"和"setA"不提供有效的预处理令牌 …

c++ concatenation c-preprocessor

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

我可以在for循环的init-expression中使用不同的类型吗?

以下代码将无法编译:

#include <iostream>

int main(){

    for (int i = 0, double j = 0; i < 10; ++i, j+=.1){
        std::cout << i << " " << j << '\n';
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否可以初始化两种不同的类型,或者我是否需要创建结构/对/等?

c++ types loops for-loop c++11

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