我是C ++中模板和元编程的新手。我现在要做的是以下内容:我有一个带有模板的结构,它需要类型为char的非类型可变参数包,定义如下:
template <char ... chs>
struct MyStruct
{};
我有第二个结构模板,需要两种类型,如:
template <typename ch1, typename ch2>
struct Together
{
};
我想要实现的目标是:
cout << Together<MyStruct<'a','b'>, MyStruct<'c','d'>>::result << '\n';
必须打印:abcd
提前致谢
答案 0 :(得分:3)
使用模板,您可以通过部分特化实现模式匹配。声明这样的主要模板声明:
template <typename First, typename Second>
struct Together;
然后为&#34; look&#34;定义类型的部分特化。某种方式:
template <char... ch1s, char... ch2s>
struct Together<MyStruct<ch1s...>, MyStruct<ch2s...>>
{
std::string result;
Together() : result({ch1s..., ch2s...}){}
};
答案 1 :(得分:1)
这是一个可能的解决方案,与使用std :: string结果的问题非常匹配:
template <char ... chs>
struct MyStruct
{
static string stringify()
{
return stringify(chs...);
}
template <typename ... cst>
static string stringify()
{
return string();
}
template <typename T, typename ... cst>
static string stringify(T c, cst... cs)
{
return string() + c + stringify<cst...>(cs...);
}
};
template <typename ch1, typename ch2>
struct Together
{
static string result() {return ch1::stringify() + ch2::stringify();}
};
int main() {
cout << Together<MyStruct<'a','b'>, MyStruct<'c','d'>>::result() << '\n';
return 0;
}
它当然可以使用更多或更少的模板参数,例如:
Together<MyStruct<'a','b','c','d'>, MyStruct<'e','f','g'>>::result()
答案 2 :(得分:0)
以下是@Ryan Haining answer的一个小改进:
template <char... Chars>
struct MyStruct
{
static constexpr char value[] {Chars..., '\0'};
};
template <char... Chars>
constexpr char MyStruct<Chars...>::value[];
template <typename, typename>
struct Together;
template <char... Chars1, char... Chars2>
struct Together<MyStruct<Chars1...>, MyStruct<Chars2...>>
{
using type = MyStruct<Chars1..., Chars2...>;
};