gpt4 book ai didi

c++ - 在编译时获取当前月份索引

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:14:22 25 4
gpt4 key购买 nike

我正在尝试在编译时将 __DATE__ 中的月份格式 Mmm 转换为数字。我需要它用于 gcc 和 MS VC 2012。

我的尝试:

template <char C0, char C1, char C2>
struct month{};

template<> struct month < 'J', 'a', 'n'> { static const unsigned id = 1; };
template<> struct month < 'S', 'e', 'p'> { static const unsigned id = 9; };

static const char c0 = __DATE__[0];
static const char c1 = __DATE__[1];
static const char c2 = __DATE__[2];

static const unsigned currId = month<c0, c1, c2>::id; //this gives error
static const unsigned currId2 = month<'S', 'e', 'p'>::id; //this is fine

在 MS VC 中给出

错误 C2970:“月”:模板参数“C0”:“c0”:涉及具有内部链接的对象的表达式不能用作非类型参数

但是在ideone工作正常。

有没有办法让这项工作跨平台/编译器?

编辑

我需要一个编译时常量 所以答案在similar question并没有真正的帮助。例如,我需要减去两个日期(代码中的当前日期和某个日期),并在这两个日期之间的差异足够大时给出编译时错误。

最佳答案

首先:你确定你在编译时需要这个吗?如果运行时是可以接受的,那很容易:http://www.keil.com/support/docs/1102.htm


但是远离理智的东西,让我们享受一些编译时的乐趣!

您在这里使用了模板,但实际上并不需要。您可以改用大量的厄运表达方式:

static const char c0 = __DATE__[0];
static const char c1 = __DATE__[1];
static const char c2 = __DATE__[2];
static const unsigned int month = (
c0 == 'J' // Jan Jun Jul
? (c1 == 'a' ? 1 : (c2 == 'n' ? 6 : 7))
: c0 == 'F' ? 2
: c0 == 'M' // Mar May
? (c2 == 'r' ? 3 : 5)
: c0 == 'A' // Apr Aug
? (c1 == 'p' ? 4 : 8)
: c0 == 'S' ? 9
: c0 == 'O' ? 10
: c0 == 'N' ? 11
: 12
);

免责声明:我只是在脑海中写下了这一点。它现在有效,但谁知道呢,也许我弄错了 March。

事实上,如果您想获得更多乐趣*,我们可以对某些字符使用算术:

static const char c0 = __DATE__[0];
static const char c1 = __DATE__[1];
static const char c2 = __DATE__[2];
static const unsigned int month = (
c0 == 'J' // Jan Jun Jul
? (c1 == 'a' ? 1 : (c2 == 'n' ? 6 : 7))
: c0 == 'M' // Mar May
? (3 + (c2 == 'y') * 2)
: c0 == 'A' // Apr Aug
? (4 + (c1 == 'u') * 4)
: c0 == 'S' ? 9
: c0 <= 'F' ? (12 - (c0 - 'D') * 5) // Feb, Dec
: (11 + 'N' - c0) // Oct, Nov
);

*:我所说的“有趣”是指:被其他开发者讨厌

由于这些是常量,因此您可以将其与模板一起使用。例如,假设我们有一份契约(Contract)工作将于 11 月结束,我们希望确保在契约(Contract)结束后我们能以高利率被带回工作几天:

#include <iostream>
using namespace std;

static const unsigned int month = ...;

template <int n> class mm {
public:
static int v;
};

template<> int mm<9>::v=3; // still employed
template<> int mm<10>::v=2; // let's not be too suspicious
template<> int mm<11>::v=1; // patience...
// no value for December - boom! we're in the money! Just in time for Christmas!

int main() {
std::cout << mm<month>::v;
return 0;
}

最后,如果您不想在全局范围内乱扔垃圾,您应该使用 constexpr 函数:

static constexpr int getMonth( void ) {
const char c0 = __DATE__[0];
const char c1 = __DATE__[1];
const char c2 = __DATE__[2];
return (
c0 == 'J' // Jan Jun Jul
? (c1 == 'a' ? 1 : (c2 == 'n' ? 6 : 7))
: c0 == 'F' ? 2
: c0 == 'M' // Mar May
? (c2 == 'r' ? 3 : 5)
: c0 == 'A' // Apr Aug
? (c1 == 'p' ? 4 : 8)
: c0 == 'S' ? 9
: c0 == 'O' ? 10
: c0 == 'N' ? 11
: 12
);
}

...

std::cout << mm<getMonth()>::v;

关于c++ - 在编译时获取当前月份索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32424382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com