如何重新排序函数参数?

看看下面的伪 C++ 代码:

typedef *** SomeType1;
typedef *** SomeType2;
typedef *** SomeType3;

void BFunc(SomeType1& st1, SomeType2& st2, SomeType3& st3)
{
    /*some work*/;
}

template <typename T1, typename T2, typename T3>
void AFunc(T1& p1, T2& p2, T3& p3)
{
    BFunc(???);
}

有两个带参数的函数。参数计数大于三个,但为了简单起见,例如让它为三个。

Afunc-它是模板函数具有相同的参数当作BFunc加上参数具有相同类型的BFunc参数。但是(!)参数的顺序BFunc可以(或不能)不同。例如:

BFunc(int, double, char)

AFunc<double, int, char>
AFunc<int, double, char>
AFunc<char, double, int>
AFunc<char, int, double>
...

那么如何重新排序内部参数AFuncBFunc使用正确的参数序列进行调用?

回答

您可以使用std::get从 a 中按其类型获取值tuple并将std::tie您的参数捆绑到 atuple的引用中。

显然,这仅在您的参数类型唯一时才有效。

确保std::get使用引用类型以避免不必要的副本。

#include <tuple>

// arbitrary argument types
struct SomeType1{};
struct SomeType2{};
struct SomeType3{};

void BFunc(SomeType1& st1, SomeType2& st2, SomeType3& st3)
{
    /*some work*/;
}

template <typename T1, typename T2, typename T3>
void AFunc(T1& p1, T2& p2, T3& p3)
{
    // Make a tuple of references to all the arguments
    auto tuple = std::tie(p1, p2, p3);

    // Find the right arguments in the tuple
    BFunc(
        std::get<SomeType1&>(tuple), 
        std::get<SomeType2&>(tuple), 
        std::get<SomeType3&>(tuple));
}

int main()
{
    SomeType1 t1;
    SomeType2 t2;
    SomeType3 t3;

    AFunc(t1,t2,t3);
    AFunc(t1,t3,t2);
    AFunc(t2,t1,t3);
    AFunc(t2,t3,t1);
    AFunc(t3,t1,t2);
    AFunc(t3,t2,t1);
}

在这里试试:https : //godbolt.org/z/7Gdc5qozW

  • @FrançoisAndrieux Fairly simple. `template<typename... Args> auto wrap(void(*fun)(Args&...)) { return [fun](auto & args...) { auto tuple = std::tie(args...); fun(std::get<Args&>(tuple)...); }; }`

以上是如何重新排序函数参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>