使用可变参数模板

时间:2017-03-09 09:34:39

标签: c++ variadic-templates

坐标的结构;

   struct point{
       int x_, y_;
    }

假设我们有一个如上定义的坐标。除了这个结构,我想创建一个函数,它接受用户想要的参数(例如,一个函数来找到三个或更多点的重心)。所以我决定使用可变参数模板。但我认识到我缺乏关于可变参数模板的信息。

至于计算重心,你应该添加所有x,并将总和除以元素数。为y元素做这件事并返回一点。你能带我一个实现这个的方法。

3 个答案:

答案 0 :(得分:2)

C ++ 17的折叠表达式使这变得轻而易举:

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_NONE
print opArg
sI = connect.SmartConnect(host='',
             user='',
             pwd='',
             port=443,
             sslContext=context)
content = sI.content
objView = content.viewManager.CreateContainerView(content.rootFolder,[vim.VirtualMachine],True)
vmList = objView.view
for vm in vmList:
    vm_obj = vm

See it live on Coliru

答案 1 :(得分:2)

如果你正在使用C ++ 14,你可以简单地遍历constexpr函数中的点,例如像这样(从Quentin's answer借来的例子):

#include <iostream>

struct point{
    int x_, y_;
};

template <class... Points>
constexpr point barycentre(Points... points) {
    point ps[] = {points...};
    point result {0, 0};
    for (std::size_t i = 0; i < sizeof...(points); i++) {
        result.x_ += ps[i].x_;
        result.y_ += ps[i].y_;
    }
    result.x_ /= sizeof...(points);
    result.y_ /= sizeof...(points);
    return result;
}

int main() {
    constexpr auto bary = barycentre(point{0, 0}, point{2, 2});
    std::cout << "(" << bary.x_ << ", " << bary.y_ << ")\n";
}

[live demo]

还有一些C ++ 11:

#include <iostream>
#include <array>
#include <type_traits>

struct point{
    int x_, y_;
};

template <std::size_t I, std::size_t N>
constexpr typename std::enable_if<I + 1 == N, point>::type barysum(std::array<point, N> const &points) {
    return point{ points[I].x_, points[I].y_ };
}

template <std::size_t I, std::size_t N>
constexpr typename std::enable_if<I + 1 != N, point>::type barysum(std::array<point, N> const &points) {
    return point{ points[I].x_ + barysum<I+1>(points).x_, points[I].y_ + barysum<I+1>(points).y_ };
}

template <std::size_t N>
constexpr point barycentre_impl(std::array<point, N> const points_array) {
    return point{ barysum<0>(points_array).x_ / static_cast<int>(N),  barysum<0>(points_array).y_ / static_cast<int>(N)};
}

template <class... Pts>
constexpr point barycentre(Pts... pts) {
    return barycentre_impl<sizeof...(Pts)>( {{pts...}} );
}

int main() {
    constexpr auto bary = barycentre(point{0, 0}, point{2, 2});
    std::cout << "(" << bary.x_ << ", " << bary.y_ << ")\n";
}

[live demo]

答案 2 :(得分:1)

初始化列表对于获取相同类型的元素更简单。

Point average(std::initializer_list<Point> list)
{
    int x = 0, y = 0;
    for(auto &i: list) {x += i.x_; y += i.y_;}
    return {x / list.size(), y / list.size()};
}

Variadic模板在类型上是通用的,因此它不适合您的情况。它不会以任何方式使你的代码执行得更快,只会膨胀二进制文件。