附加到可变参数C宏中的每个arg

时间:2015-12-23 19:28:20

标签: c++ macros

我正在尝试创建一个类似于高级语言中“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 { };

这可能吗?

2 个答案:

答案 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