繁体   English   中英

c ++模板类成员函数专门化

[英]c++ template class member function specialization

我有一个问题,我想在下面的代码中专门化模板类的模板成员函数。 这个问题的答案显式模板类成员函数的特殊化似乎表明它无法完成。 这是正确的,如果是这样,有什么工作可以使用,以便内联inc函数在编译时扩展?

非常感谢!

#include <iostream>
#include <cstdio>

template <class IT, unsigned int N>
struct IdxIterator {
private:
  int startIdx[N], endIdx[N];  
  int curIdx[N];
  IT iter;

public:
  IdxIterator(IT it, int cur[], int start[], int end[]): iter(it) {
    for (int i = 0; i < N; i++) {
      curIdx[i] = cur[i];
      startIdx[i] = start[i];
      endIdx[i] = end[i];
    }
  }

  template <int dim>
  inline void inc() {
    curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
      if (dim > 0) {
        curIdx[dim] = startIdx[dim];
        inc<dim-1>();
      }
    }
  }

  // how to declare this specialization?
  template <> template <>
  inline void inc<-1>() {
    std::cerr << "IdxIterator::inc(" << -1 << ") dim out of bounds!\n";
    throw 1;
  }

  inline IdxIterator<IT, N> operator++() {
    iter++;
    inc<N-1>();
    return *this;
  }

};

int main(int argc, char** argv) {

  int *buf = new int[100];
  int start[1], end[1];
  start[0] = 0; end[0] = 99;
  IdxIterator<int*, 1> it(buf, start, start, end);
  ++it;

  return 0;

}

G ++吐出:

test2.cpp:32:13:错误:非命名空间范围中的显式特化'struct IdxIterator'test2.cpp:32:25:错误:非命名空间范围中的显式特化'struct IdxIterator'test2.cpp:33:23:错误:模板-id'inc <-0x00000000000000001>'在主模板test2.cpp的声明中:在成员函数'void IdxIterator :: inc()[with int dim = -0x000000000000003fe,IT = int *,unsigned int N = 1u ]':test2.cpp:27:9:错误:模板实例化深度超过最大值1024(使用-ftemplate-depth =增加最大值)实例化'void IdxIterator :: inc()[with int dim = -0x000000000000003ff,IT = int *,unsigned int N = 1u]'test2.cpp:27:9:从'void IdxIterator :: inc()[with int dim = -0x00000000000000001,IT = int *,unsigned int N = 1u]递归实例化test2.cpp:27:9:从'void IdxIterator :: inc()实例化[使用int dim = 0,IT = int *,unsigned int N = 1u]'test2.cpp:41:5:从'IdxIterator IdxIterator实例化:: operator ++()[with IT = int *,unsigned int N = 1u]'test2.cpp:53:5:从这里实例化

test2.cpp:在全局范围:test2.cpp:22:15:警告:内联函数'void IdxIterator :: inc()[with int dim = -0x000000000000003ff,IT = int *,unsigned int N = 1u]'used但是从未定义[默认启用]

在C ++ 11中可能有更好的方法,但你总是可以通过重载而不是专门化:

template <int N>
struct num { };

class A
{
    template <int N>
    void f(num <N>) { };

    void f(num <-1>) { };

public:
    template <int N>
    void f() { f(num <N>()); };
};

您可以执行编译器错误消息建议的操作:

template <class IT, unsigned int N>
struct IdxIterator {
private:
  template <int dim>
  inline void inc() {
    curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
      if (dim > 0) {
        curIdx[dim] = startIdx[dim];
        inc<dim-1>();
      }
    }
  }
};

template <> template <>
inline void IdxIterator::inc<-1>() {
  std::cerr << "IdxIterator::inc(" << -1 << ") dim out of bounds!\n";
  throw 1;
}

即将定义移动到命名空间范围。

在类之外创建一个辅助结构

template<dim>
struct inc {
template<class cur, end>
      inline static void foo(cur curIdx, end endIdx) {
        curIdx[dim]++;
    if (curIdx[dim] > endIdx[dim]) {
        inc<dim-1>::foo(curIdx, endIdx);
      }
    }    
};

template<>
struct inc<0> {
    template<class cur, end>
      inline static void foo(cur, end) {
       //terminate
    }    
};

class IdxIterator {
       template<int i>
       void inc() {
        static_assert(i > 0, "error out of bounds");
         int<i>::foo(/*params*/); 
    }

};

请注意,如果您使用的是GCC,则__attribute__((always_inline))可强制进行内联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM