c++ - 这些模板可以明确吗

标签 c++ arrays templates pointers

我正在尝试为数组/指针创建一组重载模板,其中一个模板将在编译器知道数组大小时使用,而另一个模板将在它不知道时使用:

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/

相关文章:

c++ - UML图中的 protected 方法?

c++ - 实现在 C++ 类中使用的全局变量的最佳方法

c++ - 使用 Visual Studio 的 Linux 支持调试库代码

arrays - 尝试将数组 append 到 Swift 中的其他数组时获取 "extraneous argument label"

c - 如何在 C 中使用 [] 声明指向 const 字符数组的 Const 指针

带模板的 C++ Lambda

c++ - 为什么我们不能使函数显式化?

c++ - 如何将 char 数组转换为 wchar_t 数组?

c++ - 使用整数模板参数时可以展开循环吗?

c++ - Variadic 模板 - 如何创建存储传递参数的类型