实现is_function
时,我尝试使用宏手动枚举每种情况:
#define ImplIsFun(QUALIFIERS) \
template<typename R, typename... Args> \
struct is_function<R(Args...) QUALIFIERS> : public true_ \
{}; \
template<typename R, typename... Args> \
struct is_function<R(Args... COMMA...) QUALIFIERS> : public true_ \
{};
// clang-format off
ImplIsFun()
ImplIsFun(const)
ImplIsFun(&)
ImplIsFun(&&)
ImplIsFun(volatile)
ImplIsFun(noexcept)
ImplIsFun(const volatile)
ImplIsFun(const &)
ImplIsFun(const &&)
ImplIsFun(const noexcept)
ImplIsFun(volatile &)
ImplIsFun(volatile &&)
ImplIsFun(volatile noexcept)
ImplIsFun(const volatile &)
ImplIsFun(const & noexcept)
ImplIsFun(const && noexcept )
ImplIsFun(const volatile &&)
ImplIsFun(const volatile noexcept)
// clang-format on
并发生警告:
../include/rider/faiz/type_traits.hpp:315:2: warning: '...' in this location creates a C-style
varargs function [-Wambiguous-ellipsis]
ImplIsFun(const &&)
^~~~~~~~~~~~~~~~~~~
https://clang.llvm.org/docs/DiagnosticsReference.html#wambiguous-ellipsis
默认情况下启用此诊断。
诊断文字:
警告:‘…’在此位置创建C样式的varargs函数,而不是函数参数包
因此,C风格的varargs可能与模板可变参数冲突。有什么解决方法/解决方案(也欢迎使用boost.preprocessor,hana或其他代码生成器库)?