// Copyright Louis Dionne 2013-2017 // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) #include #include #include namespace hana = boost::hana; constexpr int to_int(char c) { return static_cast(c) - 48; } template constexpr long long parse(const char (&arr)[N]) { long long number = 0, base = 1; for (std::size_t i = 0; i < N; ++i) { number += to_int(arr[N - 1 - i]) * base; base *= 10; } return number; } template struct pick { static constexpr unsigned long n = parse({c...}); template constexpr auto operator()(T&& ...args) const { return hana::arg(std::forward(args)...); } }; template constexpr pick operator"" _st() { return {}; } template constexpr pick operator"" _nd() { return {}; } template constexpr pick operator"" _rd() { return {}; } template constexpr pick operator"" _th() { return {}; } static_assert(1_st(1, '2', 3.3, 444) == 1, ""); static_assert(2_nd(1, '2', 3.3, 444) == '2', ""); static_assert(3_rd(1, '2', 3.3, 444) == 3.3, ""); static_assert(4_th(1, '2', 3.3, 444) == 444, ""); int main() { }