c++ - 如何通过模板参数推导避免衰减

标签 c++ c++11 templates sfinae

简化:

// CHAR_TYPE == char, wchar_t, ...
template <typename CHAR_TYPE, unsigned CHAR_COUNT>
void Foo(CHAR_TYPE const (&value)[CHAR_COUNT]) noexcept
{
    TRACE("const ref array");
    // perform a bit of logic and forward...
}

template <typename CHAR_TYPE>
void Foo(CHAR_TYPE const* value) noexcept
{
    TRACE("const ptr");
    // perform a bit of logic and forward...
}

// [ several other overloads ]

调用点:

char const* ptr = ...
wchar_t const* wptr = ...

Foo(ptr);     // <-- good: "const ptr"
Foo(wptr);    // <-- good: "const ptr"

constexpr char const buffer[] { "blah blah blah" };
constexpr wchar_t const wbuffer[] { L"blah blah blah" };

Foo(buffer);  // <-- ambiguous
Foo(wbuffer); // <-- ambiguous

当然,我可以删除 const ref 数组重载。但是我想以不同的方式处理这些类型。我已尝试有条件地启用正确的重载,但我无法确定必要条件。

template <typename CHAR_TYPE, unsigned COUNT>
typename std::enable_if</* std::is_?? */, void>::type
    Foo(CHAR_TYPE const (&value)[COUNT]) noexcept
{
    TRACE("by ref array");
    // perform a bit of logic and forward...
}

template <typename CHAR_TYPE>
typename std::enable_if</* std::is_?? */, void>::type
    Foo(CHAR_TYPE const* value) noexcept
{
    TRACE("ptr");
    // perform a bit of logic and forward...
}

消除这些重载的最佳方法是什么?
(我宁愿不使用数组包装器)

最佳答案

一个可行的想法是删除指针并简单地拥有T相反,使用 std::enable_if_t<std::is_pointer<T>::value> guard 。下面的简化示例:

#include <iostream>
#include <type_traits>

template<class T, size_t N>
void f(T const (&) [N])
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

template<class T, std::enable_if_t<std::is_pointer<T>::value>* = nullptr >
void f(T)
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main()
{
    const char* str = "test";
    char str2[]{"test2"};

    f(str);
    f(str2);
}

Live on Coliru

关于c++ - 如何通过模板参数推导避免衰减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41290958/

相关文章:

c++ - 使用 C++11/14 正确定义 DLL 接口(interface)

C++ 11 move 语义

c++ - 在 C++ 中自动递增以下宏生成结构中的索引

c++ - 为什么 C++ 不能从赋值中推断模板类型?

c++ - OpenGL + ffmpeg 在全屏模式下运行缓慢

c++ - 地形 segmentation 和深度缓冲区

c++ - 非恢复浮点平方根算法

c++ - 在这种情况下如何使用 unique_ptr?

c++ - 如何从文件中读取 double 值?

c++ - 尝试定义嵌套模板成员函数时出现 "expected expression"