uproszczonej:Jak uniknąć próchnicy z parametrem szablonu odliczenia
// 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 ]
Callsite:
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
Oczywiście, mogę usunąć const przeciążenie tablicy ref. Jednak chciałbym obsługiwać te typy w różny sposób. Próbowałem warunkowo włączyć poprawne przeciążenie, ale nie byłem w stanie określić koniecznego stanu.
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...
}
Jaki jest najlepszy sposób na rozróżnienie tych przeciążeń?
(wolałbym nie używać opakowania array)
To może być głupie pytanie, ale w jaki sposób pierwszy szablon ma domyślnie wyodrębnić parametr wielkości? –
@MikelF Odbywa się to poprzez dedukcję typu szablonu, typem tablicy jest 'char [N]', a nie 'char *'. Tablice ** nie zawsze ** rozpadają się na wskaźniki. Lepiej powiedzieć, że tablice przekazywane przez referencje nie ulegają rozkładowi. – vsoftco