我的理解是模板参数推导仅适用于函数模板,但函数模板不允许部分特化。有没有办法实现这两个目标?
我基本上想要使用签名
来实现类似函数的对象(可以是一个仿函数)template<class InputIterator1, class InputIterator2, class OutputIterator, int distribution>
void GetQuantity(InputIterator1 frist1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, double supply, double limit);
根据分发的价值,我想要对这个模板进行一些专业化。 当我调用这个函数时,我基本上不想指定所有的类型参数,因为它们很多(因此我需要参数演绎)!
答案 0 :(得分:3)
你可以通过一个模仿分发的仿函数实现这一点,并通过调用operator()
来完成演绎:
template<int distribution>
struct GetQuantity {
template<class InputIterator1, class InputIterator2, class OutputIterator>
void operator()(
InputIterator1 frist1, InputIterator1 last1, InputIterator2 first2,
OutputIterator result, double supply, double limit );
};
template<>
struct GetQuantity<0> {
// specialized stuff
};
答案 1 :(得分:2)
部分专门化struct
的替代方法是使用std::integral_constant
重载:
template<class InputIterator1, class InputIterator2, class OutputIterator>
void GetQuantity(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
double supply, double limit,
std::integral_constant<int, 0>);
这可以通过调度员调用:
template<int distribution,
class InputIterator1, class InputIterator2, class OutputIterator>
void GetQuantity(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
double supply, double limit)
{
GetQuantity(first1, last1, first2, result, supply, limit,
std::integral_constant<int,distribution>{});
}
可以通过转换序列提供默认实现:
template<int dist>
struct der_int_const : std::integral_constant<int, dist>
{}
template<int distribution,
class InputIterator1, class InputIterator2, class OutputIterator>
void GetQuantity(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, OutputIterator result,
double supply, double limit, der_int_const<distribution>{});
即使对distribution
参数(简化),还有另一种方法甚至可以部分专业化:
#include <iostream>
#include <type_traits>
struct X0{};
struct X1{};
template<int distribution, class It,
class U = typename std::enable_if<distribution==0>::type>
void GetQuantity(It, X0={});
template<int distribution, class It,
class U = typename std::enable_if<(distribution>1)>::type>
void GetQuantity(It, X1={});
C ++ 03版:
#include <boost/type_traits.hpp>
然后使用boost::integral_constant
代替std::integral_constant
#include <boost/utility/enable_if.hpp>
struct X0{};
struct X1{};
template<int distribution, class It>
typename boost::enable_if_c<distribution==0>::type
GetQuantity(It, X0=X0()){ std::cout<<"0\n"; }
template<int distribution, class It>
typename boost::enable_if_c<(distribution>1)>::type
GetQuantity(It, X1=X1()){ std::cout<<"1\n"; }