可变模板函数将数组类型强制转换为指针

variadic template function casts array type to pointer

本文关键字:转换 指针 类型 数组 函数      更新时间:2023-10-16

此代码对指针和数组进行了部分用户专用化。

当显式调用数组专用化时,将返回所需的值。

但是,当使用可变模板函数时,数组参数会转换为指针,并调用指针专用化。

有没有办法让编译器(在本例中为g++4.8.1(不进行强制转换?

或者有没有一种不同的方法可以返回不使用模板专门化的"总大小"?

#include <iostream>
template <typename T, typename...  Params>
struct TestTemplate
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (T) + TestTemplate<Params...>::Sizeof();
    }
};

template <typename T>
struct TestTemplate<T>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (T);
    }
};

template <typename T, typename...  Params>
struct TestTemplate<T*, Params...>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (T) + TestTemplate<Params...>::Sizeof();
    }
};

template <typename T>
struct TestTemplate<T*>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (T);
    }
};

template <typename T, size_t N, typename...  Params>
struct TestTemplate<T[N], Params...>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return N * sizeof (T) + TestTemplate<Params...>::Sizeof();
    }
};

template <typename T, size_t N>
struct TestTemplate<T[N]>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return N * sizeof (T);
    }
};

template <typename... Params>
size_t GetSizeof (Params... params)
{
    return TestTemplate<Params...>::Sizeof();
}

struct TestType
{
    double x = 0., y = 0.;
    char buf[64];
};
int main (int, char *[])
{
    std::cout << TestTemplate<int[10]>::Sizeof() << std::endl; // prints 40. OK
    std::cout << GetSizeof (2, 3, 4) << std::endl; // prints 12. OK
    TestType tt;
    std::cout << GetSizeof (&tt, 1) << std::endl; // prints 84. OK
    int int_arr[10];
    std::cout << GetSizeof (int_arr, 1) << std::endl; // prints 8, want 41
}

您可以将GetSizeof替换为:(https://ideone.com/jqXT4s)

template <typename... Params>
size_t GetSizeof (const Params&... params)
{
    return TestTemplate<Params...>::Sizeof();
}

一旦你做到了,你可以简单地使用:

template <typename T, typename...  Params>
struct TestTemplate
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (typename std::remove_pointer<T>::type) + TestTemplate<Params...>::Sizeof();
    }
};
template <typename T>
struct TestTemplate<T>
{
    static size_t Sizeof()
    {
        std::cout << __FILE__ << ':' << __LINE__ << std::endl;
        return sizeof (typename std::remove_pointer<T>::type);
    }
};

作为CCD_ 2。