仅当某个函数后跟另一个函数时才允许调用它

Allowing certain function call only if it is followed by another function

我想创建一个必须用 { } 大括号调用的函数。相似的 到 if、while 和 for 语句。这样做的原因是为了防止操作员在没有添加后面必要的代码的情况下调用函数。

#include <iostream>

/* function to run the test */
bool runTest()
{
    std::cout "PASS" << std::endl;
    return true;
}

/* function will print the passed chars */
void newTest(const char *functionName, const char *testName)
{
    std::cout << functionName << " " << testName;
}

int main(void)
{
    /* OPTION 1 */
    /* You can call it like this */
    newTest("runTest", "TestName");
        runTest();
    / * OR */
    newTest("runTest", "TestName");
    {
        runTest();
    }

    /* OPTION 2 */
    /* I want the operator to be required to do */
    newTest("runTest", "TestName")
    {
        runTest();
    }
    return 0;
}

我希望选项 2 是正确的用法。因为使用选项 1,您可以这样称呼它:

newTest("runTest", "TestName");
newTest("otherTest", "TestName");
   runTest();

但是您不会对与第一次调用输出相关的 runTest() 进行必要的调用。

输出将是:

runTests TestName /*(NULL)*/
otherTest TestName PASS

这种调用方式只是检查以确保操作员在 newTest() 函数之后调用了测试。

理想情况下,如果操作员是完美的,他可以正确地调用函数。

newTest("runTest", "TestName");
    runTest();
newTest("otherTest", "TestName");
   runTest();

但我想消除错误,但自动要求操作员在调用后使用 {} 调用函数。

首先,那些 'curly brackets' 称为 'braces' - 您可能需要编辑您的问题,以便人们更好地理解。

除非有人私自更改; C++ 不是这样工作的。 此上下文中的大括号明确保留给 the scope of keywords, function-definitions, and initializer lists.

void Badger()
{ //this is fine, it's a function-definition
}
int main()
{
for(I =0; I < 5; I++)
   { //this is fine, for is a keyword.
   }
foo()
   { //This is not legal, foo must take it's perimeters within brackets, not braces.
   } 
}

如果您希望用户将代码传递给函数,您必须使用 Function-pointer, the user then may pass a existing function, or a lambda.

void Foo(bool (Function_ptr*) ()) { };
bool Function_To_Pass() { } ;
int main()
{
    Foo(&Function_To_Pass);
    Foo([]()
    {
        //Code to run here
    });
}
   #include <iostream>

/* function to run the test */
bool runTest()
{
    std::cout << " PASS" << std::endl;
    return true;
}

/* function will print the passed chars */
void newTest(bool (*function)(), const char *functionName, const char *testName)
{
    std::cout << functionName << " " << testName;
    function();
}

int main(void)
{
    newTest(runTest, "runTest", "TestName");

    return 0;
}

这将 return 基于@JohnBargman 和@NathanOliver 建议的预期结果。

理想情况下,runTest() 将允许操作员传入参数,而 runTest 函数将使用这些参数。所以我希望函数调用用大括号创建范围。喜欢:

newTest("runTests", "TestName")
{
    int number = 1;
    runTests(number);
}

但我想如果操作员正在使用此代码 he/she 应该知道 he/she 可以使用大括号来创建范围。因此不需要。