模板问题,请执教。

yisan 2003-09-05 10:41:50
我现在有一个类
template<class T, std::size_t N>
class Array {...};

需要实现如下函数
void MyFunc(const Array<float, 3>& x, const Array<float, 4>& y);
void MyFunc(const Array<double, 3>& x, const Array<double, 4>& y);
...

请问如何用一个模板函数来实现?进一步实现如下形式则更好了
template<...> // 我不知道怎么办,简单地传递类型参数无法通过(VC 7.1)
void MyFunc(const Array<T, N-1>& x, const Array<T, N>& y)
再进一步
template<...> // 我不知道怎么办
void MyFunc(const Array<T1, N-1>& x, const Array<T2, N>& y)

另外,我的一些实现是下面形式
template< template<class T, std::size_t N> class Array>
void Funcs(Array& a) {...}
这是可以使用的,可是如果用
template<class T, std::size_t N>
void Funcs(Array<T, N>& a) {...}
可是使用却会产生错误,为什么呢?

一大堆的问题,实在不好意思,可是我的等级只能给100分,如果你要,请告诉我一声。
...全文
73 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisan 2003-09-08
  • 打赏
  • 举报
回复
问题解决,使用 jfwan(大家进步) 提供的
template <typename T, size_t N, template <typename, size_t> class Array>
void my_func(const Array<T, N-1>& x, const Array<T, N>& y){ }

N-1是一个compile constant。
jfwan(大家进步)所提供的第二方案也可以正常使用,但在调用该模板函数时应该加上<float, 4>之类的显式声明供编译器推导模板参数类型。

非常感谢!
sevecol 2003-09-06
  • 打赏
  • 举报
回复
可以这样,加一个中间层:

template<typename T,int N>
class P
{
public:
P(){};
};

//
template<typename T,int N>
int hu(const P<T,N>& t1,const P<T,N-1>& t2)
{
return 10;
}//真正需要调用的函数

template<typename T,int N,typename T1>
int hu_wap(const P<T,N>& t1,const T1& t2)
{
return hu<T,N>(t1,t2);
}//我们调用的函数,就是原来函数的包装

P<int,10> y1;

P<int,9> y2;

hu_wap(y1,y2);

这样就可以了,如果y1,y2的N不满足条件,编译失败
yisan 2003-09-06
  • 打赏
  • 举报
回复
To: jfwan(大家进步)
非常感谢,可以运行。可是如果我要将N1和N2扯上关系(如N2=N1-1)该如何办呢?我不想别人传递不合适的大小,虽然可以使用STATIC_CHECK,但感觉拖泥带水的,不够干净.
klbt 2003-09-06
  • 打赏
  • 举报
回复
各显神通
kevwan 2003-09-06
  • 打赏
  • 举报
回复
Sorry, I made a mistake that you've told that your compiler is VC7.1!
kevwan 2003-09-06
  • 打赏
  • 举报
回复
Otherwise I give you another version to test, but I don't know what compiler are you using! And I can't make sure it can compile in your compiler!

#include <iostream>
#include <cstddef>
#include <typeinfo>

using namespace std;

template <typename T, size_t N>
struct array_t
{
};

template <size_t N>
struct decN
{
enum { value = N - 1 };
};

template <typename T, size_t N, template <typename, size_t> class Array>
void my_func(const Array<T, decN<N>::value>& x, const Array<T, N>& y)
{
cout << "Called my_func<" << typeid(T).name() << ", " << N << ">()" << endl;
}

int main()
{
my_func(array_t<float, 3>(), array_t<float, 4>());
my_func(array_t<double, 3>(), array_t<double, 4>());
}

Good luck!
kevwan 2003-09-06
  • 打赏
  • 举报
回复
I'm using g++3.2.2, and I can define the function like below:

template <typename T, size_t N, template <typename, size_t> class Array>
void my_func(const Array<T, N-1>& x, const Array<T, N>& y)
{
}

And I think N-1 is a compile-time constant!
snzf 2003-09-05
  • 打赏
  • 举报
回复
模板参数为size_t等类型时,推演模板实参时必须是编译时常量,所以不能用
template<...>
void MyFunc(const Array<T, N-1>& x, const Array<T, N>& y)
~~~
sevecol 2003-09-05
  • 打赏
  • 举报
回复
第一个用
template<class T,std::size_t N,std::size_t N1>
void MyFunc(const Array<T,N>& x,const Array<T,N1>& y)
{
};

//
Array<int,3> a;
Array<int,4> b;
MyFunc(a,b);

第二个是你的编译器的问题,换一个对C++标准支持更好的吧,比如说VC7.1
kevwan 2003-09-05
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstddef>
#include <typeinfo>

using namespace std;

template <typename T, size_t N>
struct array_t
{
};

template <typename T, size_t N1, size_t N2, template <typename, size_t> class Array>
void my_func(const Array<T, N1>& x, const Array<T, N2>& y)
{
cout << "Called my_func<" << typeid(T).name() << ", " << N1 << ", " << N2 << ">()" << endl;
}

int main()
{
my_func(array_t<float, 3>(), array_t<float, 4>());
my_func(array_t<double, 3>(), array_t<double, 4>());
}

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧