带有一包T型的模板

时间:2016-09-07 13:33:46

标签: c++ c++14 variadic-templates

我有以下最小的代码片段,它按预期编译和执行:

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

1 个答案:

答案 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 { /* .. */ };