0

这是对这个问题的跟进

考虑以下代码

#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);
}

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

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

4

1 回答 1

0

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

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
    );
}
于 2020-02-06T11:45:08.730 回答