gpt4 book ai didi

c++ - 将参数传递给没有特定顺序的 C++ 函数

转载 作者:行者123 更新时间:2023-11-30 02:27:02 24 4
gpt4 key购买 nike

假设我有一个函数 foo,它接受两个不同类型的非原始对象,例如:

void foo(House h, Dog d) {// implementation  }

假设这些参数的放置对函数输出没有影响,那么理论上 foo(h,d) = foo (d,h)。但 C++ 不允许这样做,除非我通过以下方式重载此函数:

void foo (Dog d, House h) {// implementation   }

但是如果参数的数量增加(例如 6 个重载 3 个参数等等),这种重载就会变得很痛苦。

我的问题是,有没有什么简单的方法可以在不重复重载的情况下实现不按特定顺序传递参数的便利性?

最佳答案

用 O(n) 包装器重新排序 n 个参数是很有可能的:

#include <iostream>
using namespace std;
struct A { int a; A(int a) : a(a) {} };
struct B { int b; B(int b) : b(b) {} };
struct C { int c; C(int c) : c(c) {} };
struct D { int d; D(int d) : d(d) {} };
static void foo(A a, B b, C c, D d) { cout << a.a << " " << b.b << " " << c.c << " " << d.d << endl; }
template<class ...Args> struct Foo { void operator()(Args...); };
template<class ...Args> static void foo(Args ...args) { Foo<Args...>()(args...); }
template<class T, class U> struct Foo<T, U, C, D> { void operator()(T t, U u, C c, D d) { foo(u, t, c, d); } };
template<class T, class U, class V> struct Foo<T, U, V, D> { void operator()(T t, U u, V v, D d) { foo(v, t, u, d); } };
template<class T, class U, class V, class W> struct Foo<T, U, V, W> { void operator()(T t, U u, V v, W w) { foo(w, t, u, v); } };
int main() {
foo(A(1), B(2), C(3), D(4));
foo(D(5), C(6), B(7), A(8));
return 0;
}

(包装类 Foo 是必需的,因为函数不能部分特化。)

$ c++ -std=c++11 a.cc
$ ./a.out
1 2 3 4
8 7 6 5

请勿将此解释为对该技术的认可。相反:即使可能,也请不要这样做。

关于c++ - 将参数传递给没有特定顺序的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42151846/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com