Это псевдокод для того, что я хочу сделать.Как заставить клиента вызывать явно специализированный шаблон вместо основного шаблона?
template<typename T>
struct ConvertToT
{
static_assert(false, "Explicit specialization for T required.");
// Variant will be coerced to this type before calling Convert.
std::uint32_t GetVariantType()
{
return VT_EMPTY;
}
T Convert(CComVariant& input)
{
return "ERROR!";
}
};
template<>
struct ConvertToT<std::wstring>
{
std::uint32_t GetVariantType()
{
return VT_BSTR;
}
T Convert(CComVariant& input)
{
return std::wstring(input.bstrVal, ::SysStringLen(input.bstrVal));
}
};
/* repeat for several more explicit specializations:
* template<>
* struct ConvertToT<...>
* {
* std::uint32_t GetVariantType()
* {
* return ...;
* }
* ... Convert(CComVariant& input)
* {
* return ...;
* }
* };
*/
Есть ли способ отключить основной шаблон и потребовать использования явной специализации?
+1, и это работает. Но это не дает приятного сообщения, объясняющего, что произошло, например, 'static_assert', поэтому удерживая на ✓ на данный момент. –
@BillyONeal: Отредактировано [здесь приведен пример] (http://ideone.com/Tuiznb) , Ключ должен сделать что-то зависимое от параметра шаблона. Я бы назвал этот метод «инъекцией зависимостей». –
Это хорошо. И я могу даже сделать 'Foo''' WhileAttemptingConversionTo '' делая сообщение еще более ясным :) Спасибо! –