小编Jeh*_*han的帖子

功能模板作为参数

我一直在尝试在C++ 11中实现Python 的函数映射.它似乎适用于任何类型的可调用对象,但如果我希望它与函数模板一起使用,我必须指定模板类型参数.例:

#include <iostream>
#include <list>

template<typename T>
T abs(T x)
{
    return x < 0 ? -x : x;
}

int main()
{
    std::list<int> li = { -1, -2, -3, -4, -5 };
    for (auto i: map(&abs<int>, li))
    {
        std::cout << i << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我希望它int从函数的第二个参数推导出参数,因此能够写:

for (auto i: map(&abs, li))
{
    std::cout << i << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的map功能写成:

template<typename Callable, typename Container>
auto map(const Callable& function, Container&& iter)
    -> MapObject<Callable, …
Run Code Online (Sandbox Code Playgroud)

c++ templates function-pointers c++11

4
推荐指数
1
解决办法
913
查看次数

起源 - 恒定还是新型?

我正在编写一个Point类(在3d空间中)并且一直想知道创建原点的最佳方法是什么.这是基本类(取自Andy的例子,以防有人想知道基本实现是什么):

struct Point
{
    constexpr Point(double x_, double y_, double z_) : x(x_), y(y_), z(z_) { }

    double x;
    double y;
    double z;
};
Run Code Online (Sandbox Code Playgroud)

拥有原点的第一种方法是定义一个constexpr变量:

constexpr Point origin = { 0.0, 0.0, 0.0 };
Run Code Online (Sandbox Code Playgroud)

第二个是定义一个新类型和重载算法,如果用原点计算它们可以从优化中受益(让我们假设我写了一个constexpr构造函数Point):

struct Origin: public Point
{
    constexpr Origin():
        Point(0.0, 0.0, 0.0)
    {}
};
constexpr Origin origin;
Run Code Online (Sandbox Code Playgroud)

虽然第一种方法似乎更简单,更不容易出错,但我想知道第二种方法是否是一个好主意,是否有一些我没有看到的陷阱.

编辑:考虑参考库,我注意到CGAL使用了类似的东西:

class Origin {};
const Origin ORIGIN;
Run Code Online (Sandbox Code Playgroud)

c++ geometry c++11

4
推荐指数
1
解决办法
99
查看次数

标签 统计

c++ ×2

c++11 ×2

function-pointers ×1

geometry ×1

templates ×1