【发布时间】:2016-12-22 20:10:24
【问题描述】:
简化:
// 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...
}
消除这些重载的最佳方法是什么?
(我宁愿不使用数组包装器)
【问题讨论】:
-
这可能是一个愚蠢的问题,但是第一个模板应该如何隐式提取大小参数?
-
@MikelF 是通过模板类型推导完成的,数组的类型是
char[N],而不是char*。数组并不总是衰减为指针。更好的说法是,通过引用传递的数组不会衰减。
标签: c++ c++11 templates sfinae