如何使用类型特征使这个数组到指针的转换明确无误?

时间:2014-07-22 06:54:34

标签: c++ c++11 typetraits

我想辨别静态数组和指针。

由于数组到指针的转换具有完全匹配,以下示例无法编译,从而使foo成为可能的候选者。

我能否使用类型特征明确选择foo的第二次重载?

#include <iostream>

template<typename T>
void foo(const T* str)
{
    std::cout << "ptr: " << str << std::endl;
}

template<typename T, size_t N>
void foo(const T (&str)[N])
{
    std::cout << "arr: " << str << std::endl;
}

int main()
{
    foo("hello world"); // I would like the array version to be selected
    return 0;
}

2 个答案:

答案 0 :(得分:9)

您可以使用以下内容:

namespace detail
{
    template <typename T> struct foo;

    template <typename T>
    struct foo<T*>
    {
        void operator()(const T* str) {std::cout << "ptr: " << str << std::endl;}
    };

    template <typename T, std::size_t N>
    struct foo<T [N]>
    {
        void operator()(const T (&str)[N]) {std::cout << "arr: " << str << std::endl;}
    };
}

template<typename T>
void foo(const T& t)
{
    detail::template foo<T>()(t);
}

Live example

答案 1 :(得分:8)

template<typename T>
typename std::enable_if<std::is_pointer<T>::value,void>::type
foo(const T str)
{
    std::cout << "ptr: " << str << std::endl;
}

template<typename T, size_t N>
void
foo(const T (&str)[N])
{
    std::cout << "arr: " << str << std::endl;
}