代码之家  ›  专栏  ›  技术社区  ›  cibercitizen1

用模板与内联的C++元编程

  •  5
  • cibercitizen1  · 技术社区  · 14 年前

    是否值得编写如下代码来复制数组元素:

    #include <iostream>
    using namespace std;
    
    
    template<int START, int N> 
    struct Repeat { 
      static void copy (int * x, int * y) {
       x[START+N-1] = y[START+N-1];
       Repeat<START, N-1>::copy(x,y);
      }
    };
    
    template<int START> 
    struct Repeat<START, 0> { 
      static void copy (int * x, int * y) {
       x[START] = y[START];
      }
    };
    
    
    
    int main () {
    
    
       int a[10];
       int b[10];
    
                 // initialize
       for (int i=0; i<=9; i++) {
         b[i] = 113 + i;
         a[i] = 0;
       }
    
                // do the copy (starting at 2, 4 elements)
      Repeat<2,4>::copy(a,b);
    
                 // show
       for (int i=0; i<=9; i++) {
       cout << a[i] << endl;
       }
    
    } // () 
    

    还是使用内联函数更好?

    第一个缺点是不能在模板中使用变量。

    4 回复  |  直到 10 年前
        1
  •  8
  •   Johannes Schaub - litb    14 年前

    那不是更好。首先,它不是真正的编译时间,因为您在这里进行函数调用。如果幸运的话,编译器会将这些代码内嵌起来,并最终得到一个循环,您可以用更少的代码编写自己的代码(或者只使用 std::copy )。

        2
  •  1
  •   miked    14 年前

    一般规则:对编译时已知的事物使用模板,对运行时已知的事物使用内联。如果您在编译时不知道数组的大小,那么就不要为它使用模板。

        3
  •  0
  •   Andrey    14 年前

    你不应该这样做。模板的发明是为了不同的目的,而不是为了计算,尽管你可以做到。首先,您不能使用变量,第二个模板将在编译时生成大量未使用的结构,第三个模板是:使用 for (int i = start; i <= end; i++) b[i] = a[i];

        4
  •  0
  •   Jean-Baptiste Yunès    10 年前

    这更好,因为您可以自己控制和强制展开循环。

    编译器可以展开循环,具体取决于优化选项…

    事实上 copy 几乎是最好的答案不是一个好的一般答案,因为展开循环可以做任何内部的计算…