使用变体向量调用正确的函数专用化

Calling the correct function specialization using a vector of variants

提问人:Clutterhead 提问时间:9/14/2023 最后编辑:jonrsharpeClutterhead 更新时间:9/14/2023 访问量:85

问:

我有一个变体向量和几个完全专业化的函数。现在我想根据向量的元素调用正确的函数,而无需检查每个单独的元素(这是我目前正在第二个向量的帮助下所做的)。我甚至不需要获取变体向量中的值,我只需要获取类型。

有谁知道某种模板诡计可以帮助我?还是我认为没有比这更优雅的方法了?

#include <vector>
#include <variant>

using valType = std::variant<int, unsigned long, float, double>;

// Base Case
template<typename... Ts>
void func(Ts...);

// Full Specializations
template<>
void func(unsigned long);
template<>
void func(double, double);
template<>
void func(float, double);

int main()
{
    std::vector<valType> values;
    // In theory there is a second vector which encodes the types into ints:
    // std::vector<int> types
    values.emplace_back( float{} );
    // types.emplace_back(2)
    values.emplace_back( double{} );
    // types.emplace_back(3)
    
    // What I currently do is check if types[0] == 2 and types[1] == 3, 
    // so I know to call func(float, double).
    // Is there a more elegant way figuring out I want to call func(float, double)?
    
    return 0;
}
C++ C++20 模板专用化 变体

评论

1赞 super 9/14/2023
你看过std::visit吗?(请看第二个重载示例)
1赞 super 9/14/2023
如何确定参数的数量?总是 2 个吗?为什么不把它们放在一个中,使参数“属于一起”呢?(元组的向量)std::tuple
2赞 康桓瑋 9/14/2023
你是说?std::visit([](auto x, auto y) { func(x, y); }, values[0], values[1]);
0赞 Clutterhead 9/14/2023
@super我做到了,但我会再看一眼,以防我忽略了什么。它并不总是两个元素,这就是为什么我认为元组不合适。但我也会调查一下,以防我监督了什么。谢谢。
1赞 super 9/14/2023
@Clutterhead 那么,如果不先查看类型来确定它,您如何希望知道它是 1、2、3 还是 4 参数函数呢?将参数打包到分组元组中将为您解决这个问题。一个元组对一个函数调用,元组可以包含任意数量的元素。

答: 暂无答案