Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板中元函数的最大大小_C++_C++11_Templates_Metaprogramming_Variadic Templates - Fatal编程技术网

C++ 可变模板中元函数的最大大小

C++ 可变模板中元函数的最大大小,c++,c++11,templates,metaprogramming,variadic-templates,C++,C++11,Templates,Metaprogramming,Variadic Templates,我试图在可变模板中实现一个元函数(?),以计算编译时少数类型的sizeof的最大值 template<typename... Ts> struct MaxSizeof { static constexpr size_t value = 0; }; template<typename T, typename... Ts> struct MaxSizeof { static constexpr size_t value = std::max(sizeof(T), t

我试图在可变模板中实现一个元函数(?),以计算编译时少数类型的
sizeof
的最大值

template<typename... Ts> struct MaxSizeof {
  static constexpr size_t value = 0;
};

template<typename T, typename... Ts> struct MaxSizeof {
  static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value);
};
你能帮我修改密码吗


编译器是MSVC++2017工具集v141。

std::max
自C++14以来仅标记为
constepr
,因此您必须自己编写。此外,不能重载结构,这也是代码失败的原因之一

这里有一个解决方案需要C++14的
std::max
,您可以根据需要更改为使用自定义的解决方案

template<typename... Ts>
struct MaxSizeof : std::integral_constant<std::size_t, std::max({sizeof(Ts)...})> {};
模板
结构MaxSizeof:std::integral_常量{};

std::max
自C++14以来仅标记为
constepr
,因此您必须自己编写。此外,不能重载结构,这也是代码失败的原因之一

这里有一个解决方案需要C++14的
std::max
,您可以根据需要更改为使用自定义的解决方案

template<typename... Ts>
struct MaxSizeof : std::integral_constant<std::size_t, std::max({sizeof(Ts)...})> {};
模板
结构MaxSizeof:std::integral_常量{};

需要两个修复程序:

  • 正如@Phil1970所指出的,我忘记了
    static
    value
    定义
  • 我必须在第7行指定模板参数:
    structmaxsizeof{
    而不是简单地
    structmaxsizeof{
  • 因此,编译以下代码:

    template<typename... Ts> struct MaxSizeof {
      static constexpr size_t value = 0;
    };
    
    template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> {
      static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value);
    };
    
    模板结构MaxSizeof{
    静态constexpr size\u t值=0;
    };
    模板结构MaxSizeof{
    静态constexpr size\u t value=std::max(sizeof(t),typename MaxSizeof::value);
    };
    
    需要两个修复程序:

  • 正如@Phil1970所指出的,我忘记了
    static
    value
    定义
  • 我必须在第7行指定模板参数:
    structmaxsizeof{
    而不是简单地
    structmaxsizeof{
  • 因此,编译以下代码:

    template<typename... Ts> struct MaxSizeof {
      static constexpr size_t value = 0;
    };
    
    template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> {
      static constexpr size_t value = std::max(sizeof(T), typename MaxSizeof<Ts...>::value);
    };
    
    模板结构MaxSizeof{
    静态constexpr size\u t值=0;
    };
    模板结构MaxSizeof{
    静态constexpr size\u t value=std::max(sizeof(t),typename MaxSizeof::value);
    };
    
    您的专业化没有正确的语法,应该是:

    template<typename T, typename... Ts>
    struct MaxSizeof<T, Ts...> { // Note the <T, Ts...> here
        // ....
    };
    
    模板
    struct MaxSizeof{//注意这里的
    // ....
    };
    
    您的专业化没有正确的语法,应该是:

    template<typename T, typename... Ts>
    struct MaxSizeof<T, Ts...> { // Note the <T, Ts...> here
        // ....
    };
    
    模板
    struct MaxSizeof{//注意这里的
    // ....
    };
    
    需要另一个次要修复:

    template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> {
      static constexpr size_t value = std::max(sizeof(T), MaxSizeof<Ts...>::value); // there should be with no `typename` 
    };
    
    模板结构MaxSizeof{
    static constexpr size\u t value=std::max(sizeof(t),MaxSizeof::value);//应该没有'typename'的
    };
    
    需要另一个次要修复:

    template<typename T, typename... Ts> struct MaxSizeof<T, Ts...> {
      static constexpr size_t value = std::max(sizeof(T), MaxSizeof<Ts...>::value); // there should be with no `typename` 
    };
    
    模板结构MaxSizeof{
    static constexpr size\u t value=std::max(sizeof(t),MaxSizeof::value);//应该没有'typename'的
    };
    
    constexpr之前是否缺少静态数据?@Phil1970,谢谢,我已更新了代码和错误消息。constexpr之前是否缺少静态数据?@Phil1970,谢谢,我已更新了代码和错误消息。但在“Varidic数据结构”下的第一个示例中作者似乎重载了一个结构,不是吗?@SergeRogatch如果你指的是第一个,那就是一个函数。后面有一个结构,这是部分专门化。但在第一个例子中,在“变量数据结构”下作者似乎重载了一个结构,不是吗?@SergeRogatch如果你指的是第一个,那是一个函数。后面有一个结构,那就是部分专门化。