Compile-Time Creation of Array of Templated Objects in High Level Synthesis











up vote
-2
down vote

favorite












I'm trying to accomplish this with HLS, not with "normal" C++, so most libraries (STL, boost, etc.) won't work as they can't be synthesized (manual memory management is not allowed). I think this should be possible with template metaprogramming, but I'm a little stuck.



I want to create an array of shift registers, each with a variable depth. I have N inputs, and I want to create N shift registers, with depths 1 to N, where N is known at compile time. My shift register class basically looks like



template<int DEPTH>
class shift_register{
int registers[DEPTH];
...
};


I tried following this and adapting it: Programmatically create static arrays at compile time in C++ , however, the issue is with the last line. Each templated shift register is going to be a different type, and so can't be put together in an array. But I do need an array, as there wouldn't be a way to access each shift register.



Any help would be appreciated!










share|improve this question


















  • 3




    Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
    – Swordfish
    Nov 12 at 1:28








  • 1




    yes, but what you showed is basically std::array<> so why not use that?
    – Swordfish
    Nov 12 at 1:41








  • 1




    You can't have an array of elements which types are different from another.
    – Swordfish
    Nov 12 at 1:46






  • 1




    You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
    – Swordfish
    Nov 12 at 1:47






  • 2




    So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
    – Yakk - Adam Nevraumont
    Nov 12 at 4:03















up vote
-2
down vote

favorite












I'm trying to accomplish this with HLS, not with "normal" C++, so most libraries (STL, boost, etc.) won't work as they can't be synthesized (manual memory management is not allowed). I think this should be possible with template metaprogramming, but I'm a little stuck.



I want to create an array of shift registers, each with a variable depth. I have N inputs, and I want to create N shift registers, with depths 1 to N, where N is known at compile time. My shift register class basically looks like



template<int DEPTH>
class shift_register{
int registers[DEPTH];
...
};


I tried following this and adapting it: Programmatically create static arrays at compile time in C++ , however, the issue is with the last line. Each templated shift register is going to be a different type, and so can't be put together in an array. But I do need an array, as there wouldn't be a way to access each shift register.



Any help would be appreciated!










share|improve this question


















  • 3




    Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
    – Swordfish
    Nov 12 at 1:28








  • 1




    yes, but what you showed is basically std::array<> so why not use that?
    – Swordfish
    Nov 12 at 1:41








  • 1




    You can't have an array of elements which types are different from another.
    – Swordfish
    Nov 12 at 1:46






  • 1




    You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
    – Swordfish
    Nov 12 at 1:47






  • 2




    So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
    – Yakk - Adam Nevraumont
    Nov 12 at 4:03













up vote
-2
down vote

favorite









up vote
-2
down vote

favorite











I'm trying to accomplish this with HLS, not with "normal" C++, so most libraries (STL, boost, etc.) won't work as they can't be synthesized (manual memory management is not allowed). I think this should be possible with template metaprogramming, but I'm a little stuck.



I want to create an array of shift registers, each with a variable depth. I have N inputs, and I want to create N shift registers, with depths 1 to N, where N is known at compile time. My shift register class basically looks like



template<int DEPTH>
class shift_register{
int registers[DEPTH];
...
};


I tried following this and adapting it: Programmatically create static arrays at compile time in C++ , however, the issue is with the last line. Each templated shift register is going to be a different type, and so can't be put together in an array. But I do need an array, as there wouldn't be a way to access each shift register.



Any help would be appreciated!










share|improve this question













I'm trying to accomplish this with HLS, not with "normal" C++, so most libraries (STL, boost, etc.) won't work as they can't be synthesized (manual memory management is not allowed). I think this should be possible with template metaprogramming, but I'm a little stuck.



I want to create an array of shift registers, each with a variable depth. I have N inputs, and I want to create N shift registers, with depths 1 to N, where N is known at compile time. My shift register class basically looks like



template<int DEPTH>
class shift_register{
int registers[DEPTH];
...
};


I tried following this and adapting it: Programmatically create static arrays at compile time in C++ , however, the issue is with the last line. Each templated shift register is going to be a different type, and so can't be put together in an array. But I do need an array, as there wouldn't be a way to access each shift register.



Any help would be appreciated!







c++ templates metaprogramming template-meta-programming






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 12 at 1:10









Kartik Prabhu

1611210




1611210








  • 3




    Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
    – Swordfish
    Nov 12 at 1:28








  • 1




    yes, but what you showed is basically std::array<> so why not use that?
    – Swordfish
    Nov 12 at 1:41








  • 1




    You can't have an array of elements which types are different from another.
    – Swordfish
    Nov 12 at 1:46






  • 1




    You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
    – Swordfish
    Nov 12 at 1:47






  • 2




    So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
    – Yakk - Adam Nevraumont
    Nov 12 at 4:03














  • 3




    Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
    – Swordfish
    Nov 12 at 1:28








  • 1




    yes, but what you showed is basically std::array<> so why not use that?
    – Swordfish
    Nov 12 at 1:41








  • 1




    You can't have an array of elements which types are different from another.
    – Swordfish
    Nov 12 at 1:46






  • 1




    You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
    – Swordfish
    Nov 12 at 1:47






  • 2




    So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
    – Yakk - Adam Nevraumont
    Nov 12 at 4:03








3




3




Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
– Swordfish
Nov 12 at 1:28






Sounds like an x/y-problem to me. Explain what "HLS" is and what you want to accomplish (not how). Up to now you said nothing but showed a trivial class containing an array.
– Swordfish
Nov 12 at 1:28






1




1




yes, but what you showed is basically std::array<> so why not use that?
– Swordfish
Nov 12 at 1:41






yes, but what you showed is basically std::array<> so why not use that?
– Swordfish
Nov 12 at 1:41






1




1




You can't have an array of elements which types are different from another.
– Swordfish
Nov 12 at 1:46




You can't have an array of elements which types are different from another.
– Swordfish
Nov 12 at 1:46




1




1




You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
– Swordfish
Nov 12 at 1:47




You introduced a term "HLS" which you didn't explain and now you want to add "what needs to happen is that delays need to be added" some mysterious delays ... you aren't making any sense.
– Swordfish
Nov 12 at 1:47




2




2




So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
– Yakk - Adam Nevraumont
Nov 12 at 4:03




So "array" means packed buffer of uniform type that can be accessed by runtime index. I have no idea what subset of this you need, but apparently you don't want uniform types. We cannot solve a problem without aidea what the problem is.
– Yakk - Adam Nevraumont
Nov 12 at 4:03












3 Answers
3






active

oldest

votes

















up vote
0
down vote













Just to clarify, my problem was the following: generate N shift_registers, templated from 1 to N, where N is a compile time constant.



For example, if I had N=4, I could easily write this as:



shift_register<1> sr1;
shift_register<2> sr2;
shift_register<3> sr3;
shift_register<4> sr4;


But this wouldn't be easy to change, if I wanted a different value for N in the future.



I ended up using the preprocessor and took the solution from here: How do I write a recursive for-loop "repeat" macro to generate C code with the CPP preprocessor?



I used the macros from that solution like this:



#define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

#define BODY(i) shift_register<i> CAT(sr,i)
REPEAT_ADD_ONE(BODY, N, 1);


And then something similar to that in order to access the shift registers, in a sort of array fashion.



This let me achieve the compile time generation that I was looking for, and get the array type access I needed.






share|improve this answer





















  • Does my solution help you?
    – David Ledger
    Nov 12 at 9:30


















up vote
0
down vote













Your question was somewhat difficult to understand but I'll do my best...



template <typename ... Args>
constexpr auto make_array(Args && ... pArgs)
{
using type = std::common_type_t<std::decay_t<Args>...>;
return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
}


Then use it like this:



auto constexpr var_array_of_arrays = std::make_tuple
(
make_array(1, 2, 3, 3),
make_array(2, 3, 4),
make_array(1, 2, 3 ,4 ,3, 5)
);


To get the M'th element you access it like this, n has to actually be a compile-time constant:



std::get<M>(var_array_of_arrays);


To access the Nth element in the Mth array:



auto constexpr value = std::get<M>(var_array_of_arrays)[N]


An to improve the interface:



template <size_t M, size_t N, typename T >
constexpr decltype(auto) get_element(T && pInput)
{
return std::get<M>(std::forward<T>(pInput))[N];
}


Used like this:



auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);


This will allow you to use an array of variable length arrays, or atleast something that behaves like that and is identical to that in memory.
A full example is here:
Online compiler






share|improve this answer






























    up vote
    0
    down vote













    Whenever I hear "compile time number sequence" I think std::index_sequence



    namespace detail {
    template <typename>
    struct shift_registers;

    template <std::size_t ... Is> // 0, 1, ... N-1
    struct shift_registers<std::index_sequence<Is...> > {
    using type = std::tuple<shift_register<Is + 1>...>;
    };

    template <typename T>
    using shift_registers_t = typename shift_registers<T>::type
    }

    template <std::size_t N>
    using shift_registers = detail::shift_registers_t<std::make_index_sequence<N>>;





    share|improve this answer























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254830%2fcompile-time-creation-of-array-of-templated-objects-in-high-level-synthesis%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      0
      down vote













      Just to clarify, my problem was the following: generate N shift_registers, templated from 1 to N, where N is a compile time constant.



      For example, if I had N=4, I could easily write this as:



      shift_register<1> sr1;
      shift_register<2> sr2;
      shift_register<3> sr3;
      shift_register<4> sr4;


      But this wouldn't be easy to change, if I wanted a different value for N in the future.



      I ended up using the preprocessor and took the solution from here: How do I write a recursive for-loop "repeat" macro to generate C code with the CPP preprocessor?



      I used the macros from that solution like this:



      #define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
      #define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

      #define BODY(i) shift_register<i> CAT(sr,i)
      REPEAT_ADD_ONE(BODY, N, 1);


      And then something similar to that in order to access the shift registers, in a sort of array fashion.



      This let me achieve the compile time generation that I was looking for, and get the array type access I needed.






      share|improve this answer





















      • Does my solution help you?
        – David Ledger
        Nov 12 at 9:30















      up vote
      0
      down vote













      Just to clarify, my problem was the following: generate N shift_registers, templated from 1 to N, where N is a compile time constant.



      For example, if I had N=4, I could easily write this as:



      shift_register<1> sr1;
      shift_register<2> sr2;
      shift_register<3> sr3;
      shift_register<4> sr4;


      But this wouldn't be easy to change, if I wanted a different value for N in the future.



      I ended up using the preprocessor and took the solution from here: How do I write a recursive for-loop "repeat" macro to generate C code with the CPP preprocessor?



      I used the macros from that solution like this:



      #define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
      #define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

      #define BODY(i) shift_register<i> CAT(sr,i)
      REPEAT_ADD_ONE(BODY, N, 1);


      And then something similar to that in order to access the shift registers, in a sort of array fashion.



      This let me achieve the compile time generation that I was looking for, and get the array type access I needed.






      share|improve this answer





















      • Does my solution help you?
        – David Ledger
        Nov 12 at 9:30













      up vote
      0
      down vote










      up vote
      0
      down vote









      Just to clarify, my problem was the following: generate N shift_registers, templated from 1 to N, where N is a compile time constant.



      For example, if I had N=4, I could easily write this as:



      shift_register<1> sr1;
      shift_register<2> sr2;
      shift_register<3> sr3;
      shift_register<4> sr4;


      But this wouldn't be easy to change, if I wanted a different value for N in the future.



      I ended up using the preprocessor and took the solution from here: How do I write a recursive for-loop "repeat" macro to generate C code with the CPP preprocessor?



      I used the macros from that solution like this:



      #define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
      #define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

      #define BODY(i) shift_register<i> CAT(sr,i)
      REPEAT_ADD_ONE(BODY, N, 1);


      And then something similar to that in order to access the shift registers, in a sort of array fashion.



      This let me achieve the compile time generation that I was looking for, and get the array type access I needed.






      share|improve this answer












      Just to clarify, my problem was the following: generate N shift_registers, templated from 1 to N, where N is a compile time constant.



      For example, if I had N=4, I could easily write this as:



      shift_register<1> sr1;
      shift_register<2> sr2;
      shift_register<3> sr3;
      shift_register<4> sr4;


      But this wouldn't be easy to change, if I wanted a different value for N in the future.



      I ended up using the preprocessor and took the solution from here: How do I write a recursive for-loop "repeat" macro to generate C code with the CPP preprocessor?



      I used the macros from that solution like this:



      #define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
      #define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__

      #define BODY(i) shift_register<i> CAT(sr,i)
      REPEAT_ADD_ONE(BODY, N, 1);


      And then something similar to that in order to access the shift registers, in a sort of array fashion.



      This let me achieve the compile time generation that I was looking for, and get the array type access I needed.







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered Nov 12 at 7:12









      Kartik Prabhu

      1611210




      1611210












      • Does my solution help you?
        – David Ledger
        Nov 12 at 9:30


















      • Does my solution help you?
        – David Ledger
        Nov 12 at 9:30
















      Does my solution help you?
      – David Ledger
      Nov 12 at 9:30




      Does my solution help you?
      – David Ledger
      Nov 12 at 9:30












      up vote
      0
      down vote













      Your question was somewhat difficult to understand but I'll do my best...



      template <typename ... Args>
      constexpr auto make_array(Args && ... pArgs)
      {
      using type = std::common_type_t<std::decay_t<Args>...>;
      return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
      }


      Then use it like this:



      auto constexpr var_array_of_arrays = std::make_tuple
      (
      make_array(1, 2, 3, 3),
      make_array(2, 3, 4),
      make_array(1, 2, 3 ,4 ,3, 5)
      );


      To get the M'th element you access it like this, n has to actually be a compile-time constant:



      std::get<M>(var_array_of_arrays);


      To access the Nth element in the Mth array:



      auto constexpr value = std::get<M>(var_array_of_arrays)[N]


      An to improve the interface:



      template <size_t M, size_t N, typename T >
      constexpr decltype(auto) get_element(T && pInput)
      {
      return std::get<M>(std::forward<T>(pInput))[N];
      }


      Used like this:



      auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);


      This will allow you to use an array of variable length arrays, or atleast something that behaves like that and is identical to that in memory.
      A full example is here:
      Online compiler






      share|improve this answer



























        up vote
        0
        down vote













        Your question was somewhat difficult to understand but I'll do my best...



        template <typename ... Args>
        constexpr auto make_array(Args && ... pArgs)
        {
        using type = std::common_type_t<std::decay_t<Args>...>;
        return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
        }


        Then use it like this:



        auto constexpr var_array_of_arrays = std::make_tuple
        (
        make_array(1, 2, 3, 3),
        make_array(2, 3, 4),
        make_array(1, 2, 3 ,4 ,3, 5)
        );


        To get the M'th element you access it like this, n has to actually be a compile-time constant:



        std::get<M>(var_array_of_arrays);


        To access the Nth element in the Mth array:



        auto constexpr value = std::get<M>(var_array_of_arrays)[N]


        An to improve the interface:



        template <size_t M, size_t N, typename T >
        constexpr decltype(auto) get_element(T && pInput)
        {
        return std::get<M>(std::forward<T>(pInput))[N];
        }


        Used like this:



        auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);


        This will allow you to use an array of variable length arrays, or atleast something that behaves like that and is identical to that in memory.
        A full example is here:
        Online compiler






        share|improve this answer

























          up vote
          0
          down vote










          up vote
          0
          down vote









          Your question was somewhat difficult to understand but I'll do my best...



          template <typename ... Args>
          constexpr auto make_array(Args && ... pArgs)
          {
          using type = std::common_type_t<std::decay_t<Args>...>;
          return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
          }


          Then use it like this:



          auto constexpr var_array_of_arrays = std::make_tuple
          (
          make_array(1, 2, 3, 3),
          make_array(2, 3, 4),
          make_array(1, 2, 3 ,4 ,3, 5)
          );


          To get the M'th element you access it like this, n has to actually be a compile-time constant:



          std::get<M>(var_array_of_arrays);


          To access the Nth element in the Mth array:



          auto constexpr value = std::get<M>(var_array_of_arrays)[N]


          An to improve the interface:



          template <size_t M, size_t N, typename T >
          constexpr decltype(auto) get_element(T && pInput)
          {
          return std::get<M>(std::forward<T>(pInput))[N];
          }


          Used like this:



          auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);


          This will allow you to use an array of variable length arrays, or atleast something that behaves like that and is identical to that in memory.
          A full example is here:
          Online compiler






          share|improve this answer














          Your question was somewhat difficult to understand but I'll do my best...



          template <typename ... Args>
          constexpr auto make_array(Args && ... pArgs)
          {
          using type = std::common_type_t<std::decay_t<Args>...>;
          return std::array<type, sizeof...(Args)>{ (type)pArgs ... };
          }


          Then use it like this:



          auto constexpr var_array_of_arrays = std::make_tuple
          (
          make_array(1, 2, 3, 3),
          make_array(2, 3, 4),
          make_array(1, 2, 3 ,4 ,3, 5)
          );


          To get the M'th element you access it like this, n has to actually be a compile-time constant:



          std::get<M>(var_array_of_arrays);


          To access the Nth element in the Mth array:



          auto constexpr value = std::get<M>(var_array_of_arrays)[N]


          An to improve the interface:



          template <size_t M, size_t N, typename T >
          constexpr decltype(auto) get_element(T && pInput)
          {
          return std::get<M>(std::forward<T>(pInput))[N];
          }


          Used like this:



          auto constexpr element0_1 = get_element<0, 1>(var_array_of_arrays);


          This will allow you to use an array of variable length arrays, or atleast something that behaves like that and is identical to that in memory.
          A full example is here:
          Online compiler







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 12 at 8:29

























          answered Nov 12 at 8:18









          David Ledger

          887




          887






















              up vote
              0
              down vote













              Whenever I hear "compile time number sequence" I think std::index_sequence



              namespace detail {
              template <typename>
              struct shift_registers;

              template <std::size_t ... Is> // 0, 1, ... N-1
              struct shift_registers<std::index_sequence<Is...> > {
              using type = std::tuple<shift_register<Is + 1>...>;
              };

              template <typename T>
              using shift_registers_t = typename shift_registers<T>::type
              }

              template <std::size_t N>
              using shift_registers = detail::shift_registers_t<std::make_index_sequence<N>>;





              share|improve this answer



























                up vote
                0
                down vote













                Whenever I hear "compile time number sequence" I think std::index_sequence



                namespace detail {
                template <typename>
                struct shift_registers;

                template <std::size_t ... Is> // 0, 1, ... N-1
                struct shift_registers<std::index_sequence<Is...> > {
                using type = std::tuple<shift_register<Is + 1>...>;
                };

                template <typename T>
                using shift_registers_t = typename shift_registers<T>::type
                }

                template <std::size_t N>
                using shift_registers = detail::shift_registers_t<std::make_index_sequence<N>>;





                share|improve this answer

























                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  Whenever I hear "compile time number sequence" I think std::index_sequence



                  namespace detail {
                  template <typename>
                  struct shift_registers;

                  template <std::size_t ... Is> // 0, 1, ... N-1
                  struct shift_registers<std::index_sequence<Is...> > {
                  using type = std::tuple<shift_register<Is + 1>...>;
                  };

                  template <typename T>
                  using shift_registers_t = typename shift_registers<T>::type
                  }

                  template <std::size_t N>
                  using shift_registers = detail::shift_registers_t<std::make_index_sequence<N>>;





                  share|improve this answer














                  Whenever I hear "compile time number sequence" I think std::index_sequence



                  namespace detail {
                  template <typename>
                  struct shift_registers;

                  template <std::size_t ... Is> // 0, 1, ... N-1
                  struct shift_registers<std::index_sequence<Is...> > {
                  using type = std::tuple<shift_register<Is + 1>...>;
                  };

                  template <typename T>
                  using shift_registers_t = typename shift_registers<T>::type
                  }

                  template <std::size_t N>
                  using shift_registers = detail::shift_registers_t<std::make_index_sequence<N>>;






                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 12 at 11:19

























                  answered Nov 12 at 11:02









                  Caleth

                  15.7k22037




                  15.7k22037






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53254830%2fcompile-time-creation-of-array-of-templated-objects-in-high-level-synthesis%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Guess what letter conforming each word

                      Port of Spain

                      Run scheduled task as local user group (not BUILTIN)