2015-07-22 2 views
0

Скажет, у меня есть Шаблонные функции, которая принимает moneypunct:Является ли объектом денежных средств International?

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

я могу использовать typename T:char_type для определения первого moneypunct аргумента шаблона Но как я могу определить (правильно ли я иметь дело с moneypunct<char> или moneypunct<wchar_t>.) (? moneypunct<char, true> или moneypunct<char, false>) ли второй аргумент шаблона является true или 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; 
}