我有以下最小的代码片段,它按预期编译和执行:
template < class T, T... Chrs>
struct mystring
{
static auto c_str()
{
static char str[] = {Chrs..., 0};
return str;
}
};
template <class T, T... Chrs>
auto operator""_t()
{
return mystring<T, Chrs...>();
}
int main()
{
auto x = "Hallo"_t ;
std::cout << x.c_str() << std::endl;
}
问题:
是否可以以超出它的方式编写模板mystring
:
auto x = mystring<'a','b','c'>();
但也
auto x = mystring< 1,2,3> ();
或任何其他类型。
我不知道怎么写(伪代码):
template < T ... Chrs> // how to define T here?
struct mystring
{ }
同样不允许以下内容:
template <typename T, T ...Chrs >
struct mystring<T...Chrs> {};
答案 0 :(得分:3)
就像你现在这样做。除了使用T
,而T
是模板参数,只需直接使用char
:
template <char... Chrs>
struct mystring
{
/* rest as before */
};
当然现在这只适用于char
而不适用wchar_t
(但是原来也是如此)
您可以通过编写类似的内容来概括:
template <class T, T... Vals>
struct array { ... };
template <char... Chrs>
using mystring = array<char, Chrs...>;
在C ++ 17中,我们将template auto
允许您编写:
template <auto... Vals>
struct array { /* .. */ };
然后由您来验证所有Vals
是否为同一类型。也许通过:
template <auto Val, decltype(Val)... Vals>
struct array { /* .. */ };