在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误



这是这个问题的后续

请考虑以下代码

#include <variant>

int add_(int a, int b){
return a+b;
}
float add_(float a, float b){
return a+b;
}
float add_(int a, float b){
return a+b;
}
float add_(float a, int b){
return a+b;
}
using Number = std::variant<int, float>;
Number add(Number const& lhs, Number const& rhs ){
return std::visit( []( auto& lhs_, auto& rhs_ )->Number { return {add_( lhs_, rhs_ )}; }, lhs, rhs );
}
int main(){
Number a = 1.f;
Number b = 2.f;
Number c = add(a, b);
}

通过向数字添加越来越多的类型并可能具有依赖于 2 个以上参数的函数,很快就会清楚,我需要定义很多函数,即在 std::variant 中找到的所有可能的参数组合。

但是,并非所有组合都是可能的和/或需要的。如果我尝试调用未为特定参数组合重载的函数,如何仅定义我需要的函数并引发异常?例如,假设我只想保留add_(int,int(或add_(float,float(函数。

我从这个网站找到了解决方案

template <class ...Fs>
struct overload : Fs... {
overload(Fs const&... fs) : Fs{fs}...
{}
using Fs::operator()...;
};

Number add(const Number& arg0, const Number& arg1){
return std::visit(
overload{
[](int a, int b)     -> Number{return add_(a, b);}
,[](float a, float b) -> Number{return add_(a, b);}
,[](auto& a, auto& b) -> Number{throw std::runtime_error("unsupported parameter combination");}
},
arg0, arg1
);
}

最新更新