繁体   English   中英

空包装时的可变参数模板类专业化

[英]Variadic template class specialization when empty pack

我有一个类Data,它拥有大量功能。 该类还可能具有0或N个附加类型,这些附加类型在实现该类的功能时是必需的:

 // in Data.h

template <typename T, typename ...Args>
class Data
{

    T f1();    
    T f2() const;    
    ... // skipped
    void f10(const T& v);

    // Pimpl
    struct Impl;
    Impl* _imp;
};

但是,如果sizeof...(Args) == 0sizeof...(Args) > 0 ,则某些功能(但不是全部!)的实现是完全不同的:主要是,内部私有实现类包含不同的实现类型。

// in DataImpl.h

template <typename T, typename ...Args>
struct ImplementationSpecificData;

template <typename T>
struct ImplementationSpecificData<T>
{
 // Some members available when sizeof...(Args) == 0

};

template <typename T, typename ...Args>
struct ImplementationSpecificData<T, Args...>
{
 // Some members available when sizeof...(Args) > 0
};

// The pimpl
template <typename T, typename ...Args> 
struct Data<T,Args...>::Impl
{
   // Some common members 
    ...

   // Following are specific whether sizeof...(Args) is > 0 or == 0
   ImplementationSpecificData<T,Args...> specificData;
};

// In Data.cpp
#include "DataImpl.h"

然后,对于具有依赖于specificData的实现的函数,我想专门研究这些函数,例如:

template <typename T, typename ...Args> 
T
Data<T,Args...>::f1() {
    // Case where sizeof...(Args) > 0
}

//以下内容无效,因为这是部分成员模板的专业化

template <typename T> 
T
Data<T>::f1() {
    // Case where sizeof...(Args) == 0
}

我尝试使用额外的Enable模板布尔值和需要的特殊功能

template <typename T, bool Enable, typename ...Args>
class Data
{
...
};

template <typename T, typename ...Args> 
T
Data<T, 
std::integral_constant<bool, sizeof...(Args) > 0>::value,
Args...>::f1() {
        // Case where sizeof...(Args) > 0
}

template <typename T, typename ...Args> 
T
Data<T, 
std::integral_constant<bool, sizeof...(Args) == 0>::value,
Args...>::f1() {
        // Case where sizeof...(Args) == 0
}

但这也不起作用,我得到以下信息:

嵌套名称说明符Data<T, std::integral_constant<bool, (sizeof...(Args) > 0)>::value, Args...>::声明未引用到类,类模板或类中模板部分专业化

有没有一种完美的方法来实现此目标,而又不使用包含纯虚拟函数的基类和没有附加类型的派生类D1以及具有附加类型的派生类D2污染我的API:这将需要维护该类的函数签名(并且在这三个类(Base,D1和D2)中都有很多功能)。

在实现中使用重载/标签分派:

template <typename T, typename ...Args>
T f1_impl(Data<T, Args...>&) {
    // sizeof...(Args) > 0
}

template <typename T>
T f1_impl(Data<T>&) {
    // sizeof...(Args) == 0
}

template <typename T, typename ...Args> 
T Data<T, Args...>::f1() {
    return f1_impl(*this);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM