我有类似下面的代码:
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)...) {}
};
这应该会导致您以后对 CNullableTextColumn
和 CNullableIntColumn
的所有使用将它们的参数正确地转发到它们的根。
因此,如果您事先知道每种类型只会有 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/