我似乎找不到使用SFINAE和可变参数模板类的好解决方案.
假设我有一个不太喜欢引用的可变参数模板对象:
template<typename... Args> class NoRef { //if any of Args... is a reference,this class will break //for example: std::tuple<std::unique_ptr<Args>...> uptrs; };
还有一个类可以方便地检查参数包是否包含引用:
template<typename T,typename... Other> struct RefCheck { static const bool value = std::is_reference<T>::value || RefCheck<Other...>::value; }; template<typename T> struct RefCheck<T> { static const bool value = std::is_reference<T>::value; };
在arg包中存在引用的情况下,如何使用它来专门化NoRef?
解决方法
这不使用SFINAE,但基本上做你想要的:
template<bool Ref,typename... Args> class NoRef_; template<typename... Args> class NoRef_<false,Args...> { std::tuple<std::unique_ptr<Args>...> uptrs; }; template<typename... Args> class NoRef_<true,Args...> { // contains reference }; template<typename... Args> using NoRef = NoRef_<RefCheck<Args...>::value,Args...>; // alternative from Nawaz template<typename... Args> struct NoRef : NoRef_<RefCheck<Args...>::value,Args...> {}