#include <iostream>

template <typename T>
T default_construct() { return T{}; }

template <typename T, T(INIT)() = &default_construct<T>>
struct Foo
{
    T value = INIT();
};

int bar() { return 42; }

int main()
{
    Foo<int> f;
    Foo<int, bar> b;

    std::cout << f.value << std::endl;
    std::cout << b.value << std::endl;
}

