我似乎找不到使用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...> {}