所以想象我们有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) 我想编写一个调试宏,在出现错误时打印调用的函数的名称。问题是有些函数返回值,我想从宏返回任何值。
\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}\nRun Code Online (Sandbox Code Playgroud)\n我遇到的问题是,有时T = void编译器不会让我将类型表达式传递void给函数:
../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));\nRun Code Online (Sandbox Code Playgroud)\n我无法重新定义在宏下调用的函数check或check_for_error函数,这些函数是我的程序外部的。此外,在计算表达式之后需要检查错误。
C++中有没有好的方法来解决这个问题?
\n类似于:“如果该表达式的 decltype 为 void,则生成此代码,否则生成该代码”。
\n在浏览我朋友的代码时,我注意到了这一点:
switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}
Run Code Online (Sandbox Code Playgroud)
交换机头中的变量是什么?他正在使用GCC,所以我认为这可能是GCC扩展.任何的想法?
我有一个带有函数指针的函数构建.我认为尝试与预处理器宏交换此功能可能会更快.至少,我想尝试宏,以便我可以测量它是否生成更快的代码.
它或多或少是这样的:
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"不提供有效的预处理令牌 …
以下代码将无法编译:
#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)
是否可以初始化两种不同的类型,或者我是否需要创建结构/对/等?