我正在尝试为数组/指针创建一组重载模板,其中一个模板将在编译器知道数组大小时使用,而另一个模板将在它不知道时使用:
template <typename T, size_t SZ>
void moo(T (&arr)[SZ])
{ ... }
template <typename T>
void moo(T *ptr)
{ ... }
问题是当编译器知道数组的大小时,重载是不明确的,编译失败。
是否有某种方法可以解决歧义(可能通过 SFINAE)或者这是不可能的。
最佳答案
可以判断模板参数是否为数组:
template<class T> struct is_array {
enum { value = false };
};
template<class T, size_t N> struct is_array<T[N]> {
enum { value = true };
};
template<class T> void f(T const&) {
std::cout << is_array<T>::value << std::endl;
}
将其与 enable_if
相结合,可以使上述内容变得明确。例如使用 Boost.TypeTraits:
template <typename T, size_t SZ>
typename boost::enable_if<boost::is_array<T>, void>::type
f(T (&arr)[SZ]) {}
有引用文献,但是根本不需要 SFINAE:
template<class T, size_t SZ> void f(T (&arr)[SZ]) {}
template<class T> void f(T* const& t) {}
Johannes 提出了另一个更适合当前情况的选项 - 使用 SFINAE 代替有问题的指针重载:
template <typename T, size_t SZ> void f(T (&arr)[SZ]) {}
template <typename T>
typename boost::enable_if<boost::is_pointer<T>, void>::type
f(T ptr) {}
关于c++ - 这些模板可以明确吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890320/