我注意到一本教科书,您可以为标准库函数提供自己的实现,例如swap(x,y)通过函数重载的模板特化.这对于可以从赋值交换以外的其他东西中受益的任何类型都是有用的,STL containers例如(我已经知道了已经写过的掉期).
我的问题是:
什么更好:模板专业化为您的专业交换实现,或函数重载提供您希望在没有模板的情况下使用的确切参数?
为什么更好?或者如果他们是平等的,为什么呢?
c++ stl overloading standard-library template-specialization
有关:
考虑这对可变参数模板:
template<typename Dummy>
bool All(Param& c) {
return true;
}
template<typename Dummy, Func* f, Func* ...rest>
bool All(Param& c) {
return f(c) && All<Dummy, rest...>(c);
}
Run Code Online (Sandbox Code Playgroud)
这可以工作和编译.但是,如何在没有第一个模板参数的情况下编写它?
听起来微不足道?嗯,这就是我的想法.:-)让我们考虑一些想法.
template<Func* f, Func* ...rest>
bool All(Param& c) {
return f(c) && All<rest...>(c);
}
template<>
bool All(Param& c) {
return true;
}
Run Code Online (Sandbox Code Playgroud)
不会工作......当我尝试这个时,我心里有专长,但第二个想法不是它的工作原理.
在最初的例子中,我创建了两个不同的重载模板,首先采用1个模板参数,第二个采用2个或更多.没有歧义,也没有专业化.我做对了吗?
bool All(Param& c) {
return true;
}
template<Func* f, Func* ...rest>
bool All(Param& c) {
return f(c) && All<rest...>(c);
}
Run Code Online (Sandbox Code Playgroud)
不会明显工作,All<rest...> …
这与我之前的帖子有关.我想知道为什么一个尝试的解决方案不起作用.
template <typename... T> /* A */
size_t num_args ();
template <>
size_t num_args <> ()
{
return 0;
}
template <typename H, typename... T> /* B */
size_t num_args ()
{
return 1 + num_args <T...> ();
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试调用,比方说,num_args<int,float>()那么错误是函数调用是不明确的:
我不明白这是多么模糊 - A是声明而B是A声明的函数的定义.对吗?
我试图让这个例子起作用,对我之前的问题的回答似乎声称它永远不会起作用.
如果是这样的话,可变自由函数有什么意义呢?有什么可怎么办呢?