#include <iostream>
void do_something_with(int N) { std::cout << "2 + 3 = " << N << std::endl; }
template <int N>
using int_c = std::integral_constant<int, N>;
// Compile time
template <int N> void f(int_c<N>) = delete;
void f(int_c<5>N) { do_something_with(N); }
// Runtime
void f(int N){
if (N != 5){
std::abort();
}
f(int_c<5>{});
}
template <std::size_t N>
constexpr int to_number(const int (&a)[N])
{
int res = 0;
for (auto e : a) {
res *= 10;
res += e;
}
return res;
}
template <char ... Ns>
constexpr int_c<to_number({(Ns - '0')...})> operator ""_c ()
{
return {};
}
int main(){
f(5_c); // ok
// f(6_c); // error: use of deleted function ‘void f(int_c<N>) [with int N = 6; int_c<N> = std::integral_constant<int, 6>]’
f(5); // ok
std::cout << "it will abort" << std::endl;
f(6); // abort at runtime
std::cout << "never reach" << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdm9pZCBkb19zb21ldGhpbmdfd2l0aChpbnQgTikgeyBzdGQ6OmNvdXQgPDwgIjIgKyAzID0gIiA8PCBOIDw8IHN0ZDo6ZW5kbDsgfQoKdGVtcGxhdGUgPGludCBOPgp1c2luZyBpbnRfYyA9IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8aW50LCBOPjsKCi8vIENvbXBpbGUgdGltZQp0ZW1wbGF0ZSA8aW50IE4+IHZvaWQgZihpbnRfYzxOPikgPSBkZWxldGU7CnZvaWQgZihpbnRfYzw1Pk4pIHsgZG9fc29tZXRoaW5nX3dpdGgoTik7IH0KCi8vIFJ1bnRpbWUKdm9pZCBmKGludCBOKXsKICAgIGlmIChOICE9IDUpewogICAgICAgIHN0ZDo6YWJvcnQoKTsKICAgIH0KICAgIGYoaW50X2M8NT57fSk7Cn0KCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBOPgpjb25zdGV4cHIgaW50IHRvX251bWJlcihjb25zdCBpbnQgKCZhKVtOXSkKewogICAgaW50IHJlcyA9IDA7CiAgICBmb3IgKGF1dG8gZSA6IGEpIHsKICAgICAgICByZXMgKj0gMTA7CiAgICAgICAgcmVzICs9IGU7CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgp0ZW1wbGF0ZSA8Y2hhciAuLi4gTnM+CmNvbnN0ZXhwciBpbnRfYzx0b19udW1iZXIoeyhOcyAtICcwJykuLi59KT4gb3BlcmF0b3IgIiJfYyAoKQp7CiAgICByZXR1cm4ge307Cn0KCmludCBtYWluKCl7CglmKDVfYyk7IC8vIG9rCiAgICAvLyBmKDZfYyk7IC8vIGVycm9yOiB1c2Ugb2YgZGVsZXRlZCBmdW5jdGlvbiDigJh2b2lkIGYoaW50X2M8Tj4pIFt3aXRoIGludCBOID0gNjsgaW50X2M8Tj4gPSBzdGQ6OmludGVncmFsX2NvbnN0YW50PGludCwgNj5d4oCZCglmKDUpOyAvLyBvawoJc3RkOjpjb3V0IDw8ICJpdCB3aWxsIGFib3J0IiA8PCBzdGQ6OmVuZGw7CiAgICBmKDYpOyAvLyBhYm9ydCBhdCBydW50aW1lCglzdGQ6OmNvdXQgPDwgIm5ldmVyIHJlYWNoIiA8PCBzdGQ6OmVuZGw7Cn0=