【问题标题】:variadic template function casts array type to pointer可变参数模板函数将数组类型转换为指针
【发布时间】:2014-04-29 14:36:06
【问题描述】:

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

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

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

有没有办法让编译器(在这种情况下为 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() 级别处理。

标签: c++


【解决方案1】:

您可以将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)

【讨论】:

  • 现在 const* 把我绊倒了。我还在尝试不同的东西。 https://ideone.com/uUSyaI
  • 使用const Params&amp; 而不是Params&amp;&amp;,它可以工作。答案已编辑。
猜你喜欢
  • 2021-03-14
  • 2016-07-23
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多