只有当后面跟着另一个函数

时间:2016-03-04 16:42:54

标签: c++ function macros brackets statements

我想创建一个必须用{}括号调用的函数。类似 to if,while和for statement。这样做的原因是为了防止操作员调用该函数而不添加后面的必要代码。

#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();

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

2 个答案:

答案 0 :(得分:1)

首先,那些大括号&#39;被称为&#39;括号&#39; - 您可能想要编辑您的问题,以便人们更好地理解。

除非有人在没有告诉我的情况下改变它; 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,然后用户可以传递现有函数or a lambda.

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

答案 1 :(得分:0)

   #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;
}

这将根据@JohnBargman和@NathanOliver建议返回所需的结果。

理想情况下,runTest()将执行的操作是允许运算符传入参数,而runTest函数将使用这些参数。所以我希望函数调用使用大括号创建范围。像:

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

但我猜如果运营商使用此代码,他/她应该知道他/她可以使用大括号来创建范围。因此不需要。