#pragma once #include #include namespace DB { class Context; /** Позволяет получить функцию по имени. * Функция при создании также может использовать для инициализации (например, захватить SharedPtr) * какие-нибудь справочники, находящиеся в Context-е. */ class FunctionFactory : public Singleton { private: typedef IFunction* (*Creator)(const Context & context); /// Не std::function, так как меньше indirection и размер объекта. std::unordered_map functions; public: FunctionFactory(); FunctionPtr get(const String & name, const Context & context) const; template void registerFunction() { static_assert(std::is_same::value, "F::create has incorrect type"); functions[F::name] = &F::create; } }; }