目前我的库使用boost :: optional和boost :: variant。由于C ++ 17已经发布,我想添加一个选项,它可以与boost和std一起使用。
因此,我使用boost optional和variant以及std可选和变体成功测试了完整代码。
所以我添加了一个与此类似的头文件:
#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预览 有什么想法吗?
非常感谢提前!
编辑:我的gist
中有一个最小的例子答案 0 :(得分:0)
最后问题解决了。这是一个吵闹的VS. GCC编译得很好。 clang和VS的解决方案是使用显式模板参数调用函数。