On Tue, Feb 4, 2020 at 8:16 AM Михаил Найденов via Std-Proposals <std-proposals@lists.isocpp.org> wrote:
This definitely steps into both "language variant" and Pattern Matching territory. 
I am not sure what optimization we can expect from "language variant", but PM should give us close to your ideal code

void main(int argc, char const* const* argv){
    inspect(halve(args))
      Numeric x => std::cout << "You passed 2*(" << x << ") arguments\n";
    return 0;
}

The current Pattern Matching proposal doesn't give the programmer any way to write `halve` so that it can actually return either of two alternative types (`unsigned` or `double`) depending on a runtime condition (the evenness of the runtime argument).

However, I don't see anything wrong with the existing C++14 language solution to OP's problem. It's not worth pursuing any crazy core-language gymnastics unless you can provide a use-case that isn't already solvable idiomatically in C++14 (17, 20). Here's the '14 solution:

template<class F>
void halve(unsigned i, const F& f) {
    if (i % 2 == 0) {
        f(i / 2);
    } else {
        f(i * 0.5);
    }
}

int main(int argc, char**) {
    halve(argc, [](auto x) {
        std::cout << "You passed 2*(" << x << ") arguments\n";
    });
    return 0;
}

Short, readable, relatively easy to understand. Certainly easier to understand than anything proposed in the OP.

–Arthur