调用函数作为没有括号的参数

时间:2014-10-23 04:05:57

标签: c++ function-pointers alias julian-date

我有一些我不允许修改的代码:

Jd const nowJD( WTIMEOFDAY );
Jd const nowJDN( NOTIMEOFDAY );

单元测试文件中没有提到WTIMEOFDAY或NOTIMEOFDAY。我必须在某处定义它们。

我正在构建一些Julian日期,并且需要能够仅使用WTIMEOFDAY或NOTIMEOFDAY来调用函数。这两个都应该返回Julian Date或Julian Day Number。我不能在通话中使用参数或括号。

这是函数声明之一:

jd_t NOTIMEOFDAY();

这是它的定义:

jd_t Jd::NOTIMEOFDAY() {
        time_t nowTime = time(NULL);
        struct tm tmNow;
        localtime_s(&tmNow, &nowTime);
        jd_ = gregorian_to_jd(
            tmNow.tm_year + 1900,
            month_t(tmNow.tm_mon + 1),
            day_t(tmNow.tm_mday)
            );
    }

这是使用WTIMEOFDAY和NOTIMEOFDAY的测试用例中的代码:

BOOST_AUTO_TEST_CASE( test_Jd_ctor_default_no_time_of_day ) {
    time_t utcTime = time(NULL);
    struct tm tmLocal;
    localtime_s( &tmLocal, &utcTime );
    Jd const nowJD( WTIMEOFDAY );
    Jd const nowJDN( NOTIMEOFDAY );

    jd_t jdn = gregorian_to_jd( tmLocal.tm_year + 1900, month_t( tmLocal.tm_mon + 1 ), day_t( tmLocal.tm_mday ) );
    BOOST_CHECK_EQUAL( nowJDN.jd(), jdn );

    jd_t jd = gregorian_to_jd( 
        tmLocal.tm_year + 1900, month_t(tmLocal.tm_mon + 1), day_t(tmLocal.tm_mday),
        hour_t(tmLocal.tm_hour), minute_t(tmLocal.tm_min), second_t(tmLocal.tm_sec) );
    BOOST_CHECK_EQUAL( nowJD, jd );
}

如何让NOTIMEOFDAY和WTIMEOFDAY分别指向将返回当前Julian Day Number和Julian Date的函数。我只使用foo()格式调用函数。

这是Jd构造函数定义:

Jd( jd_t jd ) : jd_( jd ) { }

2 个答案:

答案 0 :(得分:0)

您需要使用

#define NOTIMEOFDAY Jd::now()

然后相应地重命名您的功能。

这就是C宏设计的那种hackery。有时候没有更优雅的解决方案。

答案 1 :(得分:0)

我不确定它是否正是Garth想要的但我将WTIMEOFDAY定义为do { let regex = try NSRegularExpression(pattern: regex, options: NSRegularExpressionOptions(rawValue: 0)) let nstext = text as NSString let all = NSRange(location: 0, length: nstext.length) var matches: Array<String> = Array<String>() regex.enumerateMatchesInString(text, options: NSMatchingOptions(rawValue: 0), range: all) { (result : NSTextCheckingResult?, _, _) in let theResult = nstext.substringWithRange(result!.rangeAtIndex(1)) matches.append(theResult) } print(matches) return matches.joinWithSeparator("") } catch { return "" } 定义为constexpr并创建了一个特殊的构造函数,它带有char = 'a'个标志并在有或没有实例化的情况下对其进行实例化基于旗帜值的时间。