我有一个模板功能,我想为其提供专业化,以便处理boost::optional<T>
。但是,如果我想让我的专业化处理所有类型的boost::optional<T>
而不是像boost::optional<int>
这样的特定类型,我似乎无法找到适合这种情况的语法。< / p>
这是一个可编辑的例子:
#include <boost/optional.hpp>
template <typename T>
void foo(const T& t)
{}
// This works.
template<>
void foo<int>(const int& t)
{}
// This works.
template<>
void foo<boost::optional<int>>(const boost::optional<int>& t)
{}
// What to do in this case??
// template <typename U>
// void foo<boost::optional<U>>(const boost::optional<U>& t)
// {}
int main() {}
答案 0 :(得分:6)
template <typename U>
void foo(const boost::optional<U>& t)
{
}
答案 1 :(得分:1)
你不能局部专门化模板功能。但你可以为class
namespace detail
{
template <typename T>
struct foo_impl
{
void operator () (const T&) const {};
}
template <>
struct foo_impl<int> // Full specialization for int
{
void operator () (int) const {};
}
template <>
struct foo_impl<boost::optional<int>> // Full specialization for boost::optional<int>
{
void operator () (const boost::optional<int>&) const {};
}
template <typename T>
struct foo_impl<boost::optional<T>> // Partial specialization for boost::optional<T>
{
void operator () (const boost::optional<T>&) const {};
}
}
template <typename T>
void foo(const T& t)
{
detail::foo_impl<T>{}(t); // Forward to correct struct
}
否则你可以提供过载(可能更简单)
template <typename T>
void foo(const T&) {}
void foo(int) {}
void foo(const boost::optional<int>&) {}
template <typename T>
void foo(const boost::optional<T>&) {}
关于重载方法的注意事项:
- `foo(42)` and `foo<int>(42)` won't call the same function
- and similarly, with `boost::optional<int> opt_i;`,
`foo(opt_i)`, `foo<int>(opt_i)` and `foo<boost::optional<int>>(opt_i)`
will call 3 different functions.