【问题标题】:Is it possible to use type_traits to differentiate between char & wchar_t?是否可以使用 type_traits 来区分 char 和 wchar_t?
【发布时间】:2011-07-07 11:11:07
【问题描述】:

我正在尝试使用 C++0x 的 type_traits 功能编写一个可以同时处理 char 和 wchar_t 的函数。是的,我知道如何在没有 type_traits 的情况下做到这一点,但我想使用 type_traits 来更好地理解该功能。

template <typename T>
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::true_type)
{
    _splitpath(fullFilePath.c_str(),NULL,NULL,base,ext);
}

template <typename T>
void SplitIt(T* base, T* ext, const std::basic_string<T>& fullFilePath, std::false_type)
{
    _wsplitpath(fullFilePath.c_str(),NULL,NULL,base,ext);
}

template <typename T>
std::basic_string<T> GetBaseName(const std::basic_string<T>& fullFilePath)
{
    T base[300], ext[50];

    SplitIt(base, ext, fullFilePath, /*What goes here?*/);

    return std::basic_string<T>(buf) + ext;
}


int main()
{
    std::basic_string<TCHAR> baseName = GetBaseName(std::basic_string<TCHAR>(__FILE__));
}

是否有任何 type_traits 属性可以区分 char 和 wchar_t?

【问题讨论】:

    标签: c++ typetraits


    【解决方案1】:

    我认为有一个is_same 属性,所以

    SplitIt(base, ext, fullFilePath, is_same<T, char>());
    

    应该可以。

    【讨论】:

    • 噗,简单的解决方案! ......我什至没有想到这一点感到羞耻...... :(
    • 太棒了!尽管在我的代码中应该是 is_same 。谢谢。
    【解决方案2】:

    AFAICS,&lt;type_traits&gt; 标头中没有类似的东西。但是,自己制作是微不足道的,您只需要切换重载,因为以下现在为char(以及其他所有内容)生成std::false_type,为wchar_t 生成std::true_type

    #include <type_traits>
    
    template<class T>
    struct is_wchar
      : std::false_type
    {
    };
    
    template<>
    struct is_wchar<wchar_t>
      : std::true_type
    {
    };
    
    // usage:
    
    SplitIt(base, ext, fullFilePath, is_wchar<T>());
    

    【讨论】:

    • is_same 标头中有 is_same 属性,它完全实现了这种行为...
    • 谢谢,这也不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2015-07-09
    • 2016-04-07
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多