gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:18:01 24 4
gpt4 key购买 nike

我有类似下面的代码:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com