Является ли moneypunct Object International?

Скажем, у меня есть шаблонная функция, которая принимает moneypunct:

template <typename T>
void foo(const T& bar);

я могу использовать typename T:char_type определить первый moneypunct шаблон аргумента (имею ли я дело с moneypunct<char> или moneypunct<wchar_t>.) Но как я могу определить, является ли второй аргумент шаблона true или же false (moneypunct<char, true> или же moneypunct<char, false>?)

Это единственный способ сделать это, чтобы изменить мою функцию:

template <typename CharT, typename International = false>
void foo(const moneypunct<CharT, International>& bar);

1 ответ

Решение

Если вы только хотите взять moneypunct, это, безусловно, будет лучшим, ясным решением:

template <typename CharT, typename International = false>
void foo(const moneypunct<CharT, International>& bar);

Однако вы все равно можете определить оба аргумента шаблона из оригинала с чертой типа:

template <typename> struct isInternational;

template <typename CharT, bool International>
struct isInternational<std::moneypunct<CharT, International>>
: std::integral_constant<bool, International>
{ }

Который вы можете использовать:

template <typename T>
void foo(const T& bar) {
    // this won't compile if T is not a std::moneypunct
    std::cout << isInternational<T>::value << std::endl;
}
Другие вопросы по тегам