【发布时间】:2018-02-27 17:26:07
【问题描述】:
我有一个可以解析字符串(日期)的类。我希望能够解析普通字符串和宽字符串:
MyClass x;
x.parse("2018-02-27");
x.parse(L"2018-02-27");
由于解析普通字符串和宽字符串的代码基本相同,所以使用模板是有意义的:
template<typename CharT>
void parse(const CharT *str)
{
// ...
}
现在,我将使用get_time 函数进行解析。它采用fmt 参数,它的类型为const CharT *,我想为此提供一个字符串文字。它必须是普通或宽字符串文字,具体取决于模板类型参数:
template<typename CharT>
void parse(const CharT *str)
{
tm date;
basic_istringstream<CharT> date_stream{str};
date_stream >> get_time(&date, ("%Y-%m-%d" or L"%Y-%m-%d", but how to choose??) );
// ...
}
我只对两个模板实例感兴趣:char 和 wchar_t。我尝试使用非类型模板参数,但没有设法得到任何可以编译的东西。
实现函数/模板最优雅的方式是什么?
【问题讨论】:
-
如果你只想要两种类型,为什么不为每种类型重载函数呢?
-
我不会(几乎)将我的代码复制粘贴两次视为“优雅”。此外,我还要维护两个功能。
-
复制:link
-
我同意重复,但即使是这个问题的第一个答案看起来更好。