是否可以在没有模板的情况下使用通用编程?

时间:2016-05-06 12:21:16

标签: c++ c++11 generic-programming

比如说我有一个从二维数组中返回值的函数:

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成员的任何东西都可以工作? (最好在编译时捕获错误,而不是运行时)。

4 个答案:

答案 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,例如GetXGetY;然后你可以按照以下方式制定你的功能。

float get_2d_noise(const IPoint& p)
{
    return noisemap[p.GetX()][p.GetY()];
}

这样,您就不必使用泛型;相反,你会使用继承。但是,您希望与get_2s_noise一起使用的任何类型都必须从IPoint派生(并以有意义的方式实现getter),但这似乎是您正在寻找的。

答案 2 :(得分:0)

  

是否可以获得相同的效果?是的,create get_2d_noise以这种方式,xy成员的任何内容都可以使用? (最好在编译时捕获错误,而不是运行时)。

这实际上是模板存在的全部要点:它们的创建是为了支持C ++中的泛型编程。所以不,除了编写模板之外,没有其他方法可以在C ++中编写模板。

答案 3 :(得分:0)

您可以编写一个将类型名称作为参数的宏,然后创建所需的函数。像

这样的东西
CREATE_2D_NOISE_FOR(someType)

扩展到

float get_2d_noise(const someType& p) {
    return noisemap[p.x][p.y];
}

然而,这是非常不推荐的,因为你放弃了模板的所有表现力并获得了宏带来的所有问题。