根据模板参数创建字符串

时间:2010-11-04 19:52:34

标签: c++ string templates

我有许多类/方法,如下所示:

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...
   }
};

但是根据CharT,我必须使用“”,“L”“,”“或”U“(对于char,wchar_t,u16char_t,u32char_t)。

必须使用什么语法来创建与此类模板参数无关的字符串?

3 个答案:

答案 0 :(得分:7)

您真的需要不同的文字,还是可以使用迭代器构造函数?

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

如果您担心将来更改文字的容易程度,可能会使用比“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();

答案 1 :(得分:1)

如果您要将字符串附加到字符串,请使用字符串流:

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();
}

我也喜欢Steve Jessop的回答。

答案 2 :(得分:1)

以下是使用MACRO的解决方案

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。如果不是,请向宏添加另一个参数。 HTH

相关问题