我有以下这些函数:
template<class Route, bool enabled=true>
inline void addRoute() {
if(!enabled) return;
routes.push_back(Route({}, {}));
}
template<class Route, bool enabled=true, class... Args>
inline void addRoute(Args&&... args, std::vector<LogLevel>&& levels_ = {},
std::vector<String>&& categories_={}) {
if(!enabled) return;
if(!removeLowerLevels(levels_)) return;
routes.push_back(Route(std::forward<Args>(args)..., levels_, categories_));
}
这个函数应该传递"主要"参数(任何路由类别的levels_和categories_);如果在派生类中有任何额外的参数,也可以传递到路由中。我希望这个函数可以以多种方式工作:
//1. takes no additional arguments
addRoute<ConsoleLogRoute, DEBUG>({LogLevel::Notice}, {"system"});
//2. Takes no additional or main arguments
addRoute<SomeCustomLogRoute>();
//3. Takes additional arguments but no main arguments
addROute<HtmlLogRoute>("textFile.html", HtmlLogRoute::MakeBulletLists);
//4. Takes any amount of additional arguments
addRoute<FileLogRoute>("filename.log", {LogLevel::Info}, {"application"});
1和2按预期工作。但3和4无法编译:
错误:候选函数需要最多2个参数,但提供了X个参数。
(其中X为3或4)
我通过提供Args
的变量来修复此错误:
addRoute<FileLogRoute, true, String>("filename.log", {LogLevel::Info}, {"application"});
我的问题是:
我该怎么做才能不必明确地写出变量的类型名称呢?就像这个printf示例中一样(摘自这里)。
std::tuple
会出现类似的问题。标准库通过传递标签来解决这个问题,请查看 http://en.cppreference.com/w/cpp/utility/tuple/tuple 中带有std::allocator_arg_t
的重载函数。 - dyp