c++ - 可变参数模板函数将数组类型转换为指针

标签 c++

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

当显式调用数组特化时,返回期望值。

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

有没有办法让编译器(在本例中为 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);
    }
};

sizeof(T[N]) == N * sizeof(T)

关于c++ - 可变参数模板函数将数组类型转换为指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23367757/

相关文章:

c++ - 在多线程应用程序中,如果函数不修改/读取数据或修改/读取临时数据,2个以上线程可以访问同一个函数吗?

c++ - 在 mac 上使用 openGL,不支持版本 '150' 错误

c++ - 使用共享库代替静态库会影响内存使用吗?

C++ 将对象重新解释为字符串并返回

c++ - 指针上的指针 - 性能损失的原因

c++ - Listen 套接字仅在 g++ 中工作,没有 -std=c++11

c++ - 如何访问( boost 元)状态机中的所有状态?

c++ - while 循环在一次迭代后终止

每个节点具有恒定时间的 C++ 树

c++ - C++ 代码中 3D 数组的输出