我正在尝试创建一个类似于高级语言中“where”约束的宏:
#define where(T, ...) typename std::enable_if< /* tricky part */ >::type
// should expand like so: trait1<T>::value && trait2<T>::value ... traitN<T>::value
所以 VA_ARGS 是特征列表,并按如下方式使用:
template<class T,
where(T, std::is_default_constructible, std::is_class)>
class A { };
这可能吗?
答案 0 :(得分:1)
也许是这样的:
#define WHERE(P, ...) join_predicate<P, __VA_ARGS__>::value
template <template <typename> typename Pred, typename ...Args>
struct join_predicate : std::conjunction<Pred<Args>...> {};
用法:
std::enable_if_t<WHERE(std::is_default_constructible, Foo, Bar, Quz), int>
我可能甚至不打扰宏,只是使用一个真正的C ++结构,也许:
template <template <typename> typename P, typename ...Args>
constexpr bool where_v = join_predicate<P, Args...>::value;
答案 1 :(得分:0)
很抱歉,四年后这个问题从死里复生,但是我认为我有一个更好的答案,完全符合我当时的目标。 (不需要多次为谓词指定参数。)
cache