模板默认初始化,如果类中没有默认构造函数 我在C++中很新。我编写了一个函数模板,将向量中的所有元素相加,如下所示: template<typename T> inline T sumator(const std::vector<T> &sequence) { T init = T{}; return accumulate(sequence.begin(), sequence.end(), init); } 模板 内联T消耗器(常数标准::向量和序列){ T init=T{}; 返回累加(sequence.begin()、sequence.end()、init); }

模板默认初始化,如果类中没有默认构造函数 我在C++中很新。我编写了一个函数模板,将向量中的所有元素相加,如下所示: template<typename T> inline T sumator(const std::vector<T> &sequence) { T init = T{}; return accumulate(sequence.begin(), sequence.end(), init); } 模板 内联T消耗器(常数标准::向量和序列){ T init=T{}; 返回累加(sequence.begin()、sequence.end()、init); },c++,c++11,c++17,C++,C++11,C++17,在默认构造函数不是declare,而是从(例如)2个参数中声明构造函数之前,所有这些都可以正常工作。 像这样: class A { private: int a; int b; public: // A() = default; A(int aa, int bb) : a(aa),b(bb){}; A operator+(const A &right) const { r

在默认构造函数不是declare,而是从(例如)2个参数中声明构造函数之前,所有这些都可以正常工作。 像这样:

class A {
    private:
        int a;
        int b;
    public:
//        A() = default;
        A(int aa, int bb) : a(aa),b(bb){};
        A operator+(const A &right) const {
            return {a + right.a, b + right.b};
        }
        bool operator==(const A &right) const {
            return (a == right.a && b == right.b);
        }

    };
    vector<A> bc = {{3,5},{5,5}};
    A res = Adder::sumator(works);
    A result = {8,10};
    assert(result,res);
A类{
私人:
INTA;
int b;
公众:
//A()=默认值;
A(int-aa,int-bb):A(aa),b(bb){};
运算符+(常量A和右侧)常量{
返回{a+right.a,b+right.b};
}
布尔运算符==(常量A和右侧)常量{
返回(a==right.a&&b==right.b);
}
};
载体


UPD:我有很多类,其中一些有默认构造函数,一些没有,但有用于2 arg的构造函数,一些用于3,e.t.c。我想很好地积累每种情况下我能想到的可能的解决方案

  • 通过提供初始值,让用户依赖于
    std::accumulate
  • 提供一个初始值为
    sumator
    的过载。如果用户的类型没有默认构造函数,则可以使用初始值调用重载
  • 坚持为其调用函数的类型具有默认构造函数
  • 模板
    内联T消耗器(常数标准::向量和序列,T初始){
    返回累加(sequence.begin()、sequence.end()、init);
    }
    模板
    内联T消耗器(常数标准::向量和序列){
    返回累加(sequence.begin()、sequence.end()、{});
    }
    
    您可以使用默认参数添加另一个参数

    template<typename T>
    inline T sumator(const std::vector<T> &sequence, const T& init = T{}) {
        return accumulate(sequence.begin(), sequence.end(), init);
    }
    
    当不能默认构造
    T
    时,指定默认值。e、 g

    sumator(some_vector, A{0, 0});
    

    您可以将其拆分为两个重载,并添加一个
    static\u assert
    ,以便在有人试图以错误的方式使用它时提供一条很好的编译错误消息

    只有当类型为默认可构造类型时,一个重载才有效,一个重载对不可构造的类型以及以下类型有效:

    #include <type_traits>
    #include <vector>
    
    template<typename T>
    T sumator(const std::vector<T>& sequence) {
        static_assert(std::is_default_constructible_v<T>);
        return std::accumulate(sequence.begin(), sequence.end(), T{});
    }
    
    template<typename T>
    T sumator(const std::vector<T>& sequence, const T& init) {
        return std::accumulate(sequence.begin(), sequence.end(), init);
    }
    

    谢谢,但请你解释一下第一个答案好吗。也许我应该使用traits,或者它对我没有帮助?@用户可以通过提供初始值直接使用
    std::acculate
    ,而不使用
    sumator
    @Баааааааааааааааа。如果你在SO中找不到答案,你可以在一篇新的帖子中提问;这段对话已经结束。
    sumator(some_vector, A{0, 0});
    
    #include <type_traits>
    #include <vector>
    
    template<typename T>
    T sumator(const std::vector<T>& sequence) {
        static_assert(std::is_default_constructible_v<T>);
        return std::accumulate(sequence.begin(), sequence.end(), T{});
    }
    
    template<typename T>
    T sumator(const std::vector<T>& sequence, const T& init) {
        return std::accumulate(sequence.begin(), sequence.end(), init);
    }
    
    template<template<class, class...> class C, class T, class... Ts>
    T sumator(const C<T, Ts...>& sequence, const T& init = T{}) {
        return std::accumulate(sequence.begin(), sequence.end(), init);
    }