比如说我有一个从二维数组中返回值的函数:
float get_2d_noise(const point& p)
{
return map2D[p.x][p.y];
}
point
是我已定义为我的图书馆一部分的课程:
struct point
{
int x;
int y;
}
除此之外:
template<typename T>
float get_2d_noise(const T& p)
{
return noisemap[p.x][p.y];
}
是否可以获得相同的效果?即,以这样的方式创建get_2d_noise
,使得具有x和y成员的任何东西都可以工作? (最好在编译时捕获错误,而不是运行时)。
答案 0 :(得分:2)
您可能使用通用lambda(c ++ 14)作弊,因此不要明确使用template
:
auto get_2d_noise = [&](const auto& p) -> float
{
return map2D[p.x][p.y];
};
答案 1 :(得分:0)
一种可能性是在语法上明确你想做什么。您可以创建一个接口IPoint
或类似的接口(在C ++中可以使用抽象类完成),您可以为数据成员定义getter,例如GetX
和GetY
;然后你可以按照以下方式制定你的功能。
float get_2d_noise(const IPoint& p)
{
return noisemap[p.GetX()][p.GetY()];
}
这样,您就不必使用泛型;相反,你会使用继承。但是,您希望与get_2s_noise
一起使用的任何类型都必须从IPoint
派生(并以有意义的方式实现getter),但这似乎是您正在寻找的。
答案 2 :(得分:0)
是否可以获得相同的效果?是的,
create get_2d_noise
以这种方式,x
和y
成员的任何内容都可以使用? (最好在编译时捕获错误,而不是运行时)。
这实际上是模板存在的全部要点:它们的创建是为了支持C ++中的泛型编程。所以不,除了编写模板之外,没有其他方法可以在C ++中编写模板。
答案 3 :(得分:0)
您可以编写一个将类型名称作为参数的宏,然后创建所需的函数。像
这样的东西CREATE_2D_NOISE_FOR(someType)
扩展到
float get_2d_noise(const someType& p) {
return noisemap[p.x][p.y];
}
然而,这是非常不推荐的,因为你放弃了模板的所有表现力并获得了宏带来的所有问题。