1

次のような構文を提供する一連のクラステンプレートの明示的な特殊化によって強化された関数テンプレートがあります

abc.GetAs<DesiredType>("Name");

(どこGetAs<t>に次のようなものがあります:

template<typename T>
T GetAs(wchar_t const* propName) const
{
    typedef Converter<T> Converter;
    auto thing = Get(propName);
    return Converter::Convert(thing);
}

)

その型が列挙型の場合に特殊化しDesiredTypeて、返される型が列挙型 (または) の基になる型と一致するようにしたいと思いenum classます。

それは可能ですか、それともクライアントは基になる型を自分で指定する必要がありますか?


次のようなコードを許可しようとしています。

enum class Example
{
    One,
    Two
}

int main()
{
    foo_ipc_class ic(L"/// Construct me");
    // Today, calls the primary template rather than an explicit
    // specialization for an integral type.
    Example ex = ic.GetAs<Example>(L"Property Name");
}
4

2 に答える 2

2

As it's impossible to partially specialise function templates, you'll have to change your implementation to use the "delegate-to-class" trick:

#include <type_traits>

// Class to delegate to
template <typename T, bool isEnum = std::is_enum<T>::value>
struct GetAs_Class {
  typedef your_return_type ReturnType;
  static ReturnType GetAs(your_parameters) { your_code; }
};

// Partial specialisation    
template <typename T>
struct GetAs_Class<T, true> {
  typedef specialisation_return_type ReturnType;
  static ReturnType GetAs(your_parameters) { specialisation_code; }
};


// Your function now delegates to the class
template <typename T>
typename GetAs_Class<T>::ReturnType GetAs(your_parameters) {
  return GetAs_Class<T>::GetAs(your_arguments);
}
于 2013-05-20T14:18:36.290 に答える