【问题标题】:C++ combining arguments template metaprogrammingC++ 组合参数模板元编程
【发布时间】:2015-03-01 20:51:25
【问题描述】:

我不熟悉 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

提前致谢

【问题讨论】:

  • 由于回答问题的人似乎对您想知道的内容有不同的解释:您在哪个方面遇到了麻烦?连接两个参数包,还是将char... 参数包转换为字符串?如果您能说明您不需要需要回答的哪些方面,将会大大改善您的问题。
  • 在编译时连接两个参数包

标签: c++ templates metaprogramming


【解决方案1】:

使用模板,您可以通过部分特化来实现模式匹配。像这样声明一个主模板声明:

template <typename First, typename Second>
struct Together;

然后以某种方式为具有“外观”的类型定义部分特化:

template <char... ch1s, char... ch2s>
struct Together<MyStruct<ch1s...>, MyStruct<ch2s...>>
{
  std::string result;
  Together() : result({ch1s..., ch2s...}){}
};

【讨论】:

    【解决方案2】:

    这是一个可能的解决方案,使用 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()
    

    【讨论】:

      【解决方案3】:

      这是@Ryan Haininganswer的一个小改进:

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

      Live demo

      【讨论】:

        猜你喜欢
        • 2018-11-11
        • 2020-06-02
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2019-06-08
        • 2017-07-21
        • 1970-01-01
        相关资源
        最近更新 更多