gpt4 book ai didi

c++ - 具有由整数模板参数指定的参数数量的类方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:39 25 4
gpt4 key购买 nike

不确定如何表达这个问题或搜索什么,所以如果这与另一个问题相同,请关闭并重定向到适当的问题。

假设

template<typename Type, int Size> class vector
{
Type data[Size];
}

是否可以像这样替换在模板特化中采用 Size 个参数的构造函数

template<typename Type> class vector3<Type,3>
{
Type data[3];
public:
vector3( Type, Type, Type );
}

在非专用模板类中有什么东西?就像一个“varargs 构造函数”,它生成一个具有 Size 个 Type 类型参数的构造函数?

涉及 C++0x 功能的解决方案很好。

最佳答案

在 C++0x 中,template typedef 终于可用了!

免责声明:没有编译任何内容......

来自维基百科的文章:

template< typename second>
using TypedefName = SomeType<OtherType, second, 5>;

在你的情况下会产生

template <class Type>
using vector3 = vector<Type, 3>;

我无法告诉你我有多渴望这个 ;)

但是它并没有解决参数问题。如前所述,您可以在此处尝试使用可变参数模板,但我不确定它们在这种情况下的应用。正常使用是使用递归方法,您需要在中间抛出一个 static_assert

编辑以考虑评论。

template <class Type, size_t Size>
class vector
{
public:
template <class... Args>
vector(Args... args): data({args...})
{
// Necessary only if you wish to ensure that the exact number of args
// is passed, otherwise there could be less than requested
BOOST_MPL_ASSERT_RELATION(sizeof...(Args), ==, Size);
}

private:
T data[Size];
};

另一种已经可用的可能性是将预处理器生成与 boost::enable_if 相结合。

template <class Type, size_t Size>
class vector
{
public:
vector(Type a0, typename boost::enable_if_c< Size == 1 >::type* = 0);
vector(Type a0, Type a1, typename boost::enable_if_c< Size == 2 >::type* = 0);
// ...
};

为生成使用 Boost.Preprocessor 使这更容易。

BOOST_PP_REPEAT(MAX_COUNT, CONSTRUCTOR_MACRO, ~);

// where MAX_COUNT is defined to the maximum size you wish
// and CONSTRUCTOR_MACRO actually generates the constructor

#define CONSTRUCTOR_MACRO(z, n, data) \
vector( \
BOOST_PP_ENUM_PARAMS(n, Type a), \
typename boost::enable_if_c< Size == n >::type* = 0 \
);

构造函数的实现留给读者作为练习。这是对 BOOST_PP_REPEAT 的另一个调用。

如您所见,它很快就会变得丑陋,所以如果您可以使用可变参数模板版本,您会过得更好。

关于c++ - 具有由整数模板参数指定的参数数量的类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3257146/

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