【问题标题】:c++ function template specialization for known size typedefed arrayc++ 已知大小类型定义数组的函数模板特化
【发布时间】:2012-02-03 12:37:01
【问题描述】:

请考虑以下代码:

#include    <iostream>
#include    <typeinfo>


template< typename Type >
void    func( Type var )
{
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid( var ).name( ) << "]." << std::endl;
    std::cout << "->    var is SCALAR. Size = " << sizeof( Type ) << std::endl;
}

#if 1
template< typename Type >
void    func( Type * var )
{
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid( var ).name( ) << "]." << std::endl;
    std::cout << "->    var is ARRAY. Size = " << sizeof( Type * ) << std::endl;
}
#endif

int main( )
{
    typedef char    char16[ 16 ];

    char16  c16 = "16 bytes chars.";

    std::cout << "Size of char16 = " << sizeof( char16 ) << std::endl;

    func( c16 );

    return  0;
}

如果我编译并运行它,我会看到:

> g++ -Wall -g3 spec_f_pointer.cpp -o spec_f_pointer
> ./spec_f_pointer
Size of char16 = 16
func: var = 16 bytes chars. [Pc].
->      var is ARRAY. Size = 8

显然,func 中打印的sizeof 指的是指针的大小,而不是typedef 数组的大小,如main() 中给出的那样。

现在我想知道如何正确地让我的 func 专注于它正确了解我的 typedef 及其大小的方式。

这里有人可以帮我吗?

非常感谢。


编辑

将专业化实现为:

template< typename Type >
void    func( Type * const &var )
{
    std::cout << __FUNCTION__ << ": var = " << var << " [" << typeid( var ).name( ) << "]." << std::endl;
    std::cout << "->    var is ARRAY. Size = " << sizeof( Type * ) << std::endl;
}

输出是:

Size of char16 = 16
func: var = 16 bytes chars. [A16_c].
->      var is SCALAR. Size = 16

我注意到类型从 Pc 更改为 A16_c。 有帮助吗?

【问题讨论】:

  • 你的方法是错误的。您通过引用获取指针,这将丢失有关数组大小的所有信息。你为什么不听我和@David 的建议?

标签: c++ templates sizeof template-specialization


【解决方案1】:

如果您想将函数专门用于数组,请执行以下操作:

template<typename T, int N>
void func(T(&var)[N])
{
    typedef T Type[N];
    std::cout << __FUNCTION__  << " [" << typeid( var ).name( ) << "]." << std::endl;
    std::cout << "->    var is ARRAY. Size = " << sizeof( Type ) << std::endl;
    std::cout << "Number of elements: " << N << std::endl;
    std::cout << "Size of each element: " << sizeof(T) << std::endl;
}

【讨论】:

  • 应该是 size_t,而不是 int?
  • @Dave:没关系,如果你问我的话。
  • @Dave:没错。所以我说没关系。
  • @fljx:你不会强迫用户传递任何东西。 T 和 N 都会自动推导出来。这是一种非常优雅的方法!
  • @fljx 你不必传递另一个参数,N 是推导出来的。
【解决方案2】:

当用作右值表达式时,数组衰减为指向第一个元素的指针。您定义的函数采用 pointer 并执行预期的操作。如果要将数组维护为数组,则需要通过引用传递它,并且由于元素的数量是类型的一部分,您可能希望将其用作另一个模板参数:

template <typename T, int N>
void f( T(&arg)[N] ) {
    cout << sizeof arg << endl;
}

【讨论】:

    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多