c++ - 如何允许模板类构造函数根据基类型支持不同数量的参数?

标签 c++ templates inheritance constructor

我有类似下面的代码:

class CIntColumn : public CColumn
{
public:
    CIntColumn(LPCTSTR pszName)
    {
    }
    // Etc.
}

class CTextColumn : public CColumn
{
public:
    CTextColumn(LPCTSTR pszName, int nMaxLength)
    {
    }
    // Etc.
}

template<typename BASE_TYPE>
CNullableColumn : public BASE_TYPE
{
public:
    // Questions about code that goes here
}

class CNullableIntColumn : public CNullableColumn<CIntColumn>
{
public:
    CNullableIntColumn(LPCTSTR pszName)
        : CNullableColumn<CIntColumn>(pszName)
    {
    }
}

class CNullableTextColumn : public CNullableColumn<CTextColumn>
{
public:
    CNullableTextColumn(LPCTSTR pszName, int nMaxLength)
        : CNullableColumn<CTextColumn>(pszName, nMaxLength)
    {
    }
}

照原样,这段代码无法编译,因为 CNullableIntColumn需要将单个参数传递给基类,并且 CNullableTextColumn需要向基类传递两个参数。

有什么技巧可以修改我的 CNullableColumn<>模板类所以它支持这两种情况?理想情况下,我可以使用某种条件编译,但 C++ 似乎不支持这里需要的那种。

最佳答案

您需要一个通用的转发构造函数,它将接受任意数量的参数并将它们传递给 CNullableColumn 的基类:

template<typename BASE_TYPE>
class CNullableColumn : public BASE_TYPE {
public:
    template<typename ... Args>
    CNullableColumn(Args && ... args) :
        BASE_TYPE(std::forward<Args>(args)...) {}
};

这应该会导致您以后对 CNullableTextColumnCNullableIntColumn 的所有使用将它们的参数正确地转发到它们的根。


因此,如果您事先知道每种类型只会有 1 个参数,除了一两个特定类型有两个参数,您可能更喜欢模板特化:

template<typename BASE_TYPE>
class CNullableColumn : public BASE_TYPE {
public:
    CNullableColumn(LPCTSTR pszName) :
        BASE_TYPE(pszName) {}
};

//Specialization
template<>
class CNullableColumn<CTextColumn> : public CTextColumn {
public:
    CNullableColumn(LPCTSTR pszName, int maxLength) :
        CTextColumn(pszName, maxLength) {}
};

//Could create other specializations for other types with different #s of arguments, if needed

现在,Template Specialization 的缺点是您必须巧妙地实现,以避免重复代码。但它至少会优雅地解决您正在尝试处理的问题,而不是将一切都变成 Varargs 的噩梦。

关于c++ - 如何允许模板类构造函数根据基类型支持不同数量的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964222/

相关文章:

c++ - float 据在 istream 输入上意外成功转换为整数

c++ - 编译时模板限制 C++

java - 理解Java继承

java - 在父类(super class)中使用子类的方法

c++ - 使用 GENICAM API 和 C++ 使用 OpenCV 创建适用于各种相机的程序

c++ - 内存稳定的 C++ vector 实现

c++ - 模板类中的数组定义

c++ - 模板化 "find-and-erase"函数出错

java - 按子类断点过滤?

c++ - 如何将图像显示到 XCB 窗口中?