提问人:bselu 提问时间:7/6/2023 最后编辑:bselu 更新时间:7/6/2023 访问量:32
将 std::enable_if 与复杂谓词一起使用
Using std::enable_if with complex predicates
问:
必须使用 C++14 我想使用 std::enable_if 使函数仅在给定某些约束的情况下可用。我使用从 libc 标头而不是(我的环境中没有可用的 C++17)来这样做,以便将约束逻辑移动到单独的构造中。or_<>
type_traits
std::disjunction
但是,我似乎遗漏了一些东西,因为我无法设法让它编译。
我的代码:
#include <type_traits>
#include <iostream>
#include <vector>
#include <list>
template <typename T>
struct IsVector : public std::false_type {};
template <typename T>
struct IsVector<std::vector<T>> : public std::true_type {};
template <typename T>
struct IsList : public std::false_type {};
template <typename T>
struct IsList<std::list<T>> : public std::true_type {};
// taken from libc type_traits
template <bool, typename, typename>
struct conditional;
template <typename...>
struct or_;
template <>
struct or_<> : public std::false_type {};
template <typename _B1>
struct or_<_B1> : public _B1 {};
template <typename _B1, typename _B2>
struct or_<_B1, _B2> : public conditional<_B1::value, _B1, _B2>::type {};
template <typename _B1, typename _B2, typename _B3, typename... _Bn>
struct or_<_B1, _B2, _B3, _Bn...> : public conditional<_B1::value, _B1, or_<_B2, _B3, _Bn...>>::type {};
// ---
template <typename T>
struct IsVectorOrList : public or_<IsVector<T>, IsList<T>>::type {};
template <typename T>
typename std::enable_if<IsVector<T>::value || IsList<T>::value, void>::type
// replacing with this line does not work
//typename std::enable_if<IsVectorOrList<T>::value, void>::type
foo(const T& list)
{
for (const auto& item : list)
{
std::cout << item << std::endl;
}
}
int main()
{
foo(std::vector<int>{17, 42});
foo(std::list<float>{1.0, 2.71, 3.14});
}
当用作约束时,它可以正常工作。如果我使用编译器抱怨:typename std::enable_if<IsVector<T>::value || IsList<T>::value, void>::type
typename std::enable_if<IsVectorOrList<T>::value>::type
traits.cpp:32:8: error: invalid use of incomplete type ‘struct conditional<true, IsVector<std::vector<int> >, IsList<std::vector<int> > >’
32 | struct or_<_B1, _B2> : public conditional<_B1::value, _B1, _B2>::type {};
| ^~~~~~~~~~~~~
traits.cpp:20:8: note: declaration of ‘struct conditional<true, IsVector<std::vector<int> >, IsList<std::vector<int> > >’
20 | struct conditional;
| ^~~~~~~~~~~
我该如何让它工作?
答:
2赞
Bob__
7/6/2023
#1
这里:
// taken from libc type_traits
template <bool, typename, typename>
struct conditional;
代码声明 ,但该类未在发布的代码段中的任何位置定义。conditional
删除这些行并使用 std::conditional
代码即可工作。
评论
1赞
bselu
7/6/2023
天哪,编译器甚至告诉我!我怎么会这么瞎......我一定看了太多 GCC 模板错误。谢谢!
评论