【发布时间】:2018-11-15 13:35:54
【问题描述】:
我正在尝试创建一种“包装器特征”,它可以检测某些T 和一些现有的一元特征Concept:
-
T是“可迭代的”,并且 -
T::value_type满足Concept
这很有用,因为我还有其他可能需要各种类型的代码,包括std::vector<various types>,我想使用这个包装器特征来处理enable_if 所述代码中的各种函数。
这是一个草图:
#include <type_traits>
#include <vector>
template <typename T, typename = void>
struct is_iterable : std::false_type {};
template <typename T>
struct is_iterable<T, std::void_t<decltype(std::declval<T&>().begin() == std::declval<T&>().end())>> : std::true_type {};
template <class T>
constexpr bool is_iterable_v = is_iterable<T>::value;
template <typename T, typename = void>
struct iterable_value_type
{
using type = std::false_type;
};
template <typename T>
struct iterable_value_type<T, std::void_t<decltype(T::value_type)>>
{
using type = typename T::value_type;
};
template <class T>
using iterable_value_type_t = typename iterable_value_type<T>::type;
// Transforms a concept "does type T have property P" into the concept
// "is type T1 an iterable with value_type T2 where T2 has property P"
template <typename T, template <typename...> typename BaseConcept>
struct CollectionConcept
{
static constexpr bool value = is_iterable_v<T> && BaseConcept<iterable_value_type_t<T>>::value;
};
int main()
{
static_assert(std::is_arithmetic<int>::value);
static_assert(CollectionConcept<std::vector<int>, std::is_arithmetic>::value);
}
不幸的是,第二个static_assert 触发了,我不知道为什么。
我该如何实现?
【问题讨论】:
-
没有恶意,但我投票决定以拼写错误结束。
-
@PasserBy 这很公平
-
OT:被称为
is_iterable,是否也值得检查operator++? -
@Bob__ 也许是的。为了完整起见,它应该更像this tbf;不过,这对我来说暂时有用