代码之家  ›  专栏  ›  技术社区  ›  cytrinox

根据模板参数创建字符串

  •  14
  • cytrinox  · 技术社区  · 14 年前

    我有 许多的 类/方法如下:

    template<typename CharT, typename TraitsT = std::char_traits<CharT> >
    struct Foo
    {
       std::basic_string<CharT, TraitsT> getFoo(void) const
       {
         return "Foo"; // + this->member_var1 + this->member_var2...
       }
    };
    

    但根据图表,我必须使用“L”、“U”或“U”(用于char、wchar_t、u16char_t、u32char_t)。

    必须使用什么语法来创建独立于此类模板参数的字符串?

    3 回复  |  直到 14 年前
        1
  •  7
  •   Steve Jessop    14 年前

    const char *f = "Foo";
    return std::basic_string<CharT, TraitsT>(f, f + 3);
    

    template <typename CharT, typename TraitsT, size_t N>
    basic_string<CharT, TraitsT> proper_string(const char (&src)[N]) {
        return basic_string<CharT, TraitsT>(src, src+N-1);
    }
    

    return proper_string<CharT, TraitsT>("Foo");
    

    template<typename T> struct FooString {
    };
    
    template<> struct FooString<char> {
        static const char *value() { return "Foo"; }
    };
    template<> struct FooString<wchar_t> {
        static const wchar_t *value() { return L"Foo"; }
    };
    ... etc ...
    
    return FooString<CharT>::value();
    
        2
  •  1
  •   Steve M    14 年前

    std::basic_string<CharT, TraitsT> getFoo(void) const
    {
      std::basic_ostringstream<CharT, TraitsT> os;
      os << "Foo";
      // os << this->member_var1 << this->member_var2...
      return os.str();
    }
    

        3
  •  1
  •   usta    14 年前

    template < typename CharT >
    struct char_t_literal_selector;
    
    template <>
    struct char_t_literal_selector< char > {
        static const char *select( const char *s, const wchar_t *, const char16_t *, const char32_t * )
        {
            return s;
        }
    };
    
    template <>
    struct char_t_literal_selector< wchar_t > {
        static const wchar_t *select( const char *, const wchar_t *s, const char16_t *, const char32_t * )
        {
            return s;
        }
    };
    
    template <>
    struct char_t_literal_selector< char16_t > {
        static const char16_t *select( const char *, const wchar_t *, const char16_t *s, const char32_t * )
        {
            return s;
        }
    };
    
    template <>
    struct char_t_literal_selector< char32_t > {
        static const char32_t *select( const char *, const wchar_t *, const char16_t *, const char32_t *s )
        {
            return s;
        }
    };
    
    #define CHART_LITERAL(str) ( char_t_literal_selector< CharT >::select( str, L ## str, u ## str, U ## str ) )
    
    
    template<typename CharT, typename TraitsT = std::char_traits<CharT> >
    struct Foo
    {
       std::basic_string<CharT, TraitsT> getFoo(void) const
       {
         return CHART_LITERAL("Foo"); // + this->member_var1 + this->member_var2...
       }
    };
    

    CharT