【问题标题】:How to wrap a function call C++ to assign variables如何包装函数调用 C++ 来分配变量
【发布时间】:2021-11-07 03:05:21
【问题描述】:

有没有办法让一个函数执行不同的函数但独立于函数执行相同的步骤?

这个例子更能说明我的意思:

ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
if (!SQL_SUCCEEDED(ret)) {
    printf("SQL Failed\n");
    DisplayError(SQL_HANDLE_STMT, stmt);
}

ret = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
if (!SQL_SUCCEEDED(ret)) {
    printf("SQL Failed\n");
    DisplayError(SQL_HANDLE_STMT, stmt);
}

除了我的特定需求之外,我想不出更一般的例子,但这里的共同点是我总是检查 SQL 函数的返回变量是否错误,如果是,打印说错误。我觉得如果可以将错误检查包装在debug 模式中,并在release 模式中剥离它会更好,但我不知道该怎么做。我希望有一个类似的答案

SQL(ret, SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env));

如果将整个调用包装在已定义的 SQL 函数中,则会调用传入的任何 sql 函数,并将其分配给变量,只要返回类型相同。

我试图想出诸如

之类的东西
#define SQL(a, x) (a = x; if (!SQL_SUCCEEDED(a)) { printf("SQL Failed\n"); DisplayError(SQL_HANDLE_STMT, stmt);})

但这不起作用。

【问题讨论】:

  • 你可以尝试用一个函数的参数来实现这个SQL函数。 (geeksforgeeks.org/passing-a-function-as-a-parameter-in-cpp)
  • 我不知道该怎么做,我需要调用的不同 SQL 函数具有可变数量的参数和这些参数的可变类型。
  • 你使用一个没有参数的简单函数,当你调用这个函数时,你使用一个 lambda 来包裹它
  • @RaduSebastianLAZIN 我在某处看到这种类型的东西存在于它是 OpenGL 函数的地方,它类似于 GL(X),它调用了传入的任何 opengl 函数 (x) 但我可以'找不到它或记得如何。

标签: c++ function wrapper


【解决方案1】:

您可以通过复制或常量引用来传递函数...

int MyFunction( const std::function<int(void)> & fn )
{
    return fn();
}

int MyFunction2( std::function<int(int)> fn )
{
    return fn(7);
}

或者传递一个 Lambda

MyFunction([]{ return SomeIntFunction(); });

或对静态函数的引用

MyFunction(&StaticIntFunction);

或者绑定函数

MyFunction(std::bind(&Class::SomeIntFunction, classInstance));

【讨论】:

  • 我正在尝试第一个,但是将 int 替换为 SQLRETURN 并且我收到错误 expression must be an lvalue or a function designator
  • 不要忘记 void 关键字:std::function
  • 我建议阅读 C++ lambda、闭包、仿函数
  • @RaduSebastianLAZIN 是的,我会的,还有cnh003,我都试过了,但仍然是同样的错误。
  • @404TeamNotFound 在这种情况下,stackoverflow.com/help/minimal-reproducible-example 将非常有帮助。没有它,我只能将您指向要检查的关键字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
相关资源
最近更新 更多