【问题标题】:To specialize a member with char* / wchar_t* MACRO使用 char* / wchar_t* MACRO 专门化成员
【发布时间】:2020-11-09 06:11:41
【问题描述】:

这是我的 simplestring 类——一个模板类,它应该同时处理 char 字符串和 wchar_t 字符串。我想为 char 字符串和 wchar_t 字符串定义一个 default_separator:

When _Thar is char, default_separator is "\n" and when _Thar is wchar_t, default_separator is L"\n"

我将 MACRO DEFAULT_SEPARATOR 定义为“\n”,并且我想为指定的成员 simplestring::default_separator 和 simplestring::default_separator 分配值,

template<typename _TChar>
struct simplestring
{
#define DEFAULT_SEPARATOR "\n"

    static const _TChar* default_separator;

    void show_tstring()
    {
        throw "no implement";
    }
};

template<>
const char* simplestring<char>::default_separator = DEFAULT_SEPARATOR;
template<>
const wchar_t* simplestring<wchar_t>::default_separator = L##DEFAULT_SEPARATOR; //doesn't compile

void simplestring<char>::show_tstring()
{
    cout << "char string\n";
    cout << default_separator << endl;
}

void simplestring<wchar_t>::show_tstring()
{
    cout << "wchar_t string\n";
    wcout << default_separator << endl;
}

static void test()
{
    simplestring<char> s;
    s.show_tstring();

    simplestring<int> s2;
    s2.show_tstring();
}

关键行L##DEFAULT_SEPARATOR 编译时出错

Error C2014 preprocessor command must start as first nonwhite space ForTest

【问题讨论】:

标签: c++ macros c++17


【解决方案1】:

感谢以上用户。

## 只在#define 后面有效,我做到了,

#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
template<>
const wchar_t* simplestring<wchar_t>::default_separator = WIDEN(DEFAULT_SEPARATOR);

其实我终于用了这个,

#ifdef _T
    template<>
    const wchar_t* ClipOprByLineT<wchar_t>::default_separator = 
    _T(DEFAULT_SEPARATOR);
#else
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
    template<>
    const wchar_t* ClipOprByLineT<wchar_t>::default_separator = 
    WIDEN(DEFAULT_SEPARATOR);
#endif

【讨论】:

  • 什么是_T? (编译器的实现细节,因此不可移植)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多