Why not "outsource" the construction to the client, they're her types anyway so she knows how to build them (see Dependency Injection).
template <class FilterPolicy, class FormatterPolicy, class WriterPolicy>
class Sink
{
public:
Sink(FilterPolicy filter,
FormatterPolicy formatter,
WriterPolicy writer) :
m_filter(std::move(filter)),
m_formatter(std::move(formatter)),
m_writer(std::move(writer)) {}
virtual void ProcessLogEntry(const Log::LogEntry &data);
private:
FilterPolicy m_filter;
FormatterPolicy m_formatter;
WriterPolicy m_writer;
};
This results in the declaration syntax:
Sink<FilterOnLogLevelPolicy,HTMLFormatPolicy,FileWriterPolicy> sink(
{log::DEBUG}, {}, {"log.html"}
);
Allowing the user to perform as complicated or as simple an initialization as she likes.