gpt4 book ai didi

c++ - 如何为 boost::variant 实现算术运算符,使其支持不同的数字类型

转载 作者:行者123 更新时间:2023-11-28 02:33:31 26 4
gpt4 key购买 nike

例如,如果我有以下变体和一个 static_visitor:

typedef boost::variant<long, int, float, double> DataType;

我希望它能工作:

DataType x(1.2);
DataType y(100);
std::cout<<boost::apply_visitor(Multiply(), x, y)<<std::endl; // should return 120

遇到这样的访问者:

struct Multiply : public boost::static_visitor<DataType>
{
template<typename T, typename U>
DataType operator()(const T& a, const U& b) const
{
// what to do here??
}

template<typename T>
DataType operator()(const T& a, const T& b) const
{
return a * b;
}
};

我如何才能做到这一点而不必在 Multiply 访问者中列出所有可能的类型组合?

最佳答案

我的建议:不要对同一类型进行特例处理,而是对可乘性进行特例处理:

struct Multiply : public boost::static_visitor<DataType> {
template<typename T, typename U>
static auto operator()(const T& a, const U& b) const
-> decltype(DataType(a*b)){
return a*b;
}
template<typename... Ts>
static DataType operator()(const Ts... params) const {
throw std::invalid_argument("can't multiply");
}
};

变化:

  • 没有任何有效组合的特殊外壳。
  • 对任何不符合的组合抛出异常。
  • 现在静态

使用表达式-SFINAE 来决定。

对于您的示例,它仍然不会返回 120,因为二进制 float 不能准确表示 1.2。

关于c++ - 如何为 boost::variant 实现算术运算符,使其支持不同的数字类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28349166/

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