【问题标题】:Aliasing boost::variant or std::variant not compilable别名 boost::variant 或 std::variant 不可编译
【发布时间】:2018-01-20 20:52:11
【问题描述】:

目前我的库使用 boost::optional 和 boost::variant。由于 C++17 已经发布,我想添加一个选项,它适用于 boost 和 std。

所以我用 boost optional 和 variant 以及 std optional 和 variant 成功测试了完整的代码。

于是我加了一个类似这样的头文件:

#ifdef USE_BOOST
#include <boost/optional.hpp>
#elif USE_STD
#include <optional>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename T>
using optional = boost::optional<T>
#elif USE_STD
template <typename T>
using optional = std::optional<T>
#endif

}

一切正常。

然后我为变体添加了类似的东西

#ifdef USE_BOOST
#include <boost/variant.hpp>
#elif USE_STD
#include <variant>
#endif

namespace Foo {

#ifdef USE_BOOST
template <typename... T>
using variant = boost::variant<T...>
// similar to the following
#elif USE_STD

template <typename...T>
using variant = std::variant<T...>;

template <class T, class... Types>
constexpr T& get(std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr T&& get(std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

template <class T, class... Types>
constexpr const T& get(const std::variant<Types...>& v) {
    return std::get<T>(v);
};

template <class T, class... Types>
constexpr const T&& get(const std::variant<Types...>&& v) {
    return std::get<T>(std::move(v));
};

#endif

}

在库中,我现在到处使用 Foo::optional 和 Foo::variant。但是现在所有的函数模板都像

template <typename... Args>
bool bar(const std::tuple<variant<Args,
                                  std::exception_ptr>...>& args)

再也找不到了。 (clang 错误消息:没有匹配的函数调用...)

使用 clang trunk 和 VS 2017 15.6.1 Preview 测试 有什么想法吗?

非常感谢!

编辑:一个最小的例子是在我的gist

【问题讨论】:

  • 你能提供一个minimal reproducible example吗?
  • Boost 提供的许多设施成为标准的一部分,但大多数在过程中发生了变化,永远不会完全兼容。你必须处理它。
  • std::tuple 已经是 C++11 的一部分,所以从来没有理由从 boost 中使用它。正如我在开头所说的那样,完整的代码可以在没有别名的情况下正常工作。所以当我使用 std::variant 或 boost 变体时。只有别名不编译。
  • 添加了小问题。

标签: c++ boost c++17


【解决方案1】:

问题终于解决了。这是 VS 中的一个错误。 GCC 编译得很好。 clang 和 VS 的解决方案是使用显式模板参数调用函数。

【讨论】:

  • 你能提供引用吗?
  • 不,抱歉。我没有搜索特定的错误。
猜你喜欢
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多