#include <iostream>
using namespace std;
template <bool isConstexpr>
struct f_impl;
template <>
struct f_impl<false>
{
static int f(int a)
{
cout << "well, I'm not constexpr f()\n";
return a;
}
};
constexpr int f_constexpr(int a)
{
return a;
}
template <>
struct f_impl<true>
{
static constexpr int f(int a)
{
return f_constexpr(a);
}
};
#define f(a) f_impl<noexcept(f_constexpr(a))>::f(a)
int main(int argc, char* argv[]) {
constexpr int a = f(7);
cout << "constexpr was called..." << endl;
int c = f(argc);
cout << "non constexpr was called, I guess..." << endl;
cout << a << endl;
cout << c << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPGJvb2wgaXNDb25zdGV4cHI+CnN0cnVjdCBmX2ltcGw7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgZl9pbXBsPGZhbHNlPgp7CglzdGF0aWMgaW50IGYoaW50IGEpCgl7CgkJY291dCA8PCAid2VsbCwgSSdtIG5vdCBjb25zdGV4cHIgZigpXG4iOwoJCXJldHVybiBhOwoJfQp9OwoKY29uc3RleHByIGludCBmX2NvbnN0ZXhwcihpbnQgYSkKewoJcmV0dXJuIGE7Cn0KCnRlbXBsYXRlIDw+CnN0cnVjdCBmX2ltcGw8dHJ1ZT4KewoJc3RhdGljIGNvbnN0ZXhwciBpbnQgZihpbnQgYSkKCXsKCQlyZXR1cm4gZl9jb25zdGV4cHIoYSk7Cgl9Cn07CgoKI2RlZmluZSBmKGEpIGZfaW1wbDxub2V4Y2VwdChmX2NvbnN0ZXhwcihhKSk+OjpmKGEpCgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7Cgljb25zdGV4cHIgaW50IGEgPSBmKDcpOwogICAgY291dCA8PCAiY29uc3RleHByIHdhcyBjYWxsZWQuLi4iIDw8IGVuZGw7IAoJaW50IGMgPSBmKGFyZ2MpOwogICAgY291dCA8PCAibm9uIGNvbnN0ZXhwciB3YXMgY2FsbGVkLCBJIGd1ZXNzLi4uIiA8PCBlbmRsOyAKCWNvdXQgPDwgYSA8PCBlbmRsOwoJY291dCA8PCBjIDw8IGVuZGw7CiAgICAKfQ==