gpt4 book ai didi

具有可变参数的 C++ 模板类构造函数

转载 作者:可可西里 更新时间:2023-11-01 15:54:31 29 4
gpt4 key购买 nike

是否可以创建一个模板函数,它接受可变数量的参数,例如,在这个 Vector< T, C > 中类构造函数:

template < typename T, uint C >
Vector< T, C >::Vector( T, ... )
{
va_list arg_list;
va_start( arg_list, C );
for( uint i = 0; i < C; i++ ) {
m_data[ i ] = va_arg( arg_list, T );
}
va_end( arg_list );
}

这几乎可以工作,但如果有人调用 Vector< double, 3 >( 1, 1, 1 ) , 只有第一个参数具有正确的值。我怀疑第一个参数是正确的,因为它被强制转换为 double在函数调用期间,其他的被解释为 int s 然后这些位被塞入 double .打电话Vector< double, 3 >( 1.0, 1.0, 1.0 )给出了期望的结果。有做这样的事情的首选方法吗?

最佳答案

唉,目前还没有什么好办法。大多数需要做类似事情的 Boost 包都使用宏技巧来定义这样的事情:

template < typename T >
Vector< T >::Vector( T )
{ ... }

template < typename T, uint C >
Vector< T, C >::Vector( T t, C c1 )
{ ... }

template < typename T, uint C >
Vector< T, C >::Vector( T t, C c1, C c2 )
{ ... }

template < typename T, uint C >
Vector< T, C >::Vector( T t, C c1, C c2, C c3 )
{ ... }

宏生成一些设定数量(通常在 10 个左右)的版本,并提供一种机制来在扩展构造之前更改参数的最大数量。

基本上,这是一个真正的痛苦,这就是为什么 C++0x 引入了可变长度模板参数和委托(delegate)方法,让您干净(安全)地完成这项工作。与此同时,您可以使用宏来完成它,也可以尝试使用支持(其中一些)这些新实验功能的 C++ 编译器。 GCC 是一个很好的工具。

请注意,由于 C++0x 尚未真正发布,情况仍可能发生变化,您的代码可能与标准的最终版本不同步。此外,即使在标准发布之后,也有 5 年左右的时间,在此期间许多编译器将仅部分支持该标准,因此您的代码将不会非常可移植。

关于具有可变参数的 C++ 模板类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2627223/

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