1. Consider using overload resolution to resolve the proper logging-method.

    - That allows you to template that member, and maybe use perfect forwarding.

2. Don't make useless costly copies. You can take arguments by `const&`.

3. Avoid `std::endl`, as constant flushing also flushes any chance of good performance down the drain.

<!-- -->

    struct Chatty {
        template<class T>
        static void log(T&& t) { std::cout << std::forward<T>(t) << '\n'; }
    };
    struct Silent {
        template<class T>
        static void log(T&&) {}
    };

4. Your `WidgetMaker` is currently restricted to policies which are templates. That's a bad idea. Better accept a type-parameter like everyone else.

5. `doAll` assumes the logging-method is static. Why then do you assign it to a `std::function`? (Yes, that function should have a signature avoiding copies, but that's a separate problem.)

    The easiest way to repair that is using a lambda. Or you can get fancy with SFINAE and maybe also allow the policy-class to only implement those parts it wants to override.