2015-01-05 30 views
3

使用大括號當我聲明C++中的陣列,我可以使用大括號這樣的:C++類的分配可變

int var[3] = {1, 2, 3}; 

可否使用大括號中聲明類,等作爲操作符重載? 我的意思是,像這樣:

class example 
{ 
private: 
    int m_sum; 
public: 
    void operator{}(int a, int b, int c) 
    { 
     m_sum = a+b+c; 
    } 
    int get_sum() 
    { 
     return m_sum; 
    } 
} 

int main() 
{ 
    example ex = {1, 2, 3}; 
    std::cout << ex.get_sum() << endl; // prints 6 
    return 0; 
} 

上面的代碼只是我的想象,但我想用大括號作爲該代碼。

+2

爲什麼不'ex例如(1,2,3)'? – Evert

+0

@Evert因爲當我聲明一個類變量時我想獲得可變參數。使用stdarg.h可能是很好的選擇,但它需要一個包含多個參數的參數。花括號分配不需要它,至少當我聲明純C數組時。 – Mossid

+0

@quantdev謝謝!我現在不確定,但也許這正是我想要的。 – Mossid

回答

10

你可能需要一個構造函數服用std::initializer_list

#include <iostream> 
#include <algorithm> 
#include <initializer_list> 

class example 
{ 
private: 
    int m_sum; 
public: 
    example(std::initializer_list<int> parameters) 
    { 
     m_sum = std::accumulate(std::begin(parameters), std::end(parameters), 0); 
    } 

    int get_sum() const 
    { 
     return m_sum; 
    } 
}; 

int main() { 
    example e = { 1, 2, 3, 4 }; 
    std::cout << e.get_sum(); 
} 

Live Demo


另一種方法是使用可變參數模板的構造(我發現它的可讀性較差,但它的優點是使代碼具有通用性:可以將任意元素傳遞給構造函數):

#include <iostream> 
#include <algorithm> 
#include <initializer_list> 

class example 
{ 
private: 
    int m_sum; 
public: 
    template <class... Ts> example(Ts&&... vs) : m_sum(compute_sum(vs...)) { } 

    int get_sum() const 
    { 
     return m_sum; 
    } 

private: 
    template<typename Ts1> 
    Ts1 compute_sum(const Ts1& val) { return val; } // termination 

    template<typename Ts1, typename... Ts> 
    Ts1 compute_sum(const Ts1& arg1, const Ts&... args) 
    { 
     return arg1 + compute_sum(args...); 
    } 
}; 

Live Demo


注:

有C中沒有operator{} ++。

+0

我試圖在第一個代碼示例中傳遞一個數組。它沒有工作。有沒有辦法將一個整數數組傳遞給構造函數? – Superman

+0

@Superman:你不能在初始化列表中做這件事,當列表初始化成爲可能時,它們只是作爲數組的代理,但你可以添加一個構造器來使它適用於任何容器,包括數組,請參見[here](http ://coliru.stacked-crooked.com/a/743c5b87642b4108) – quantdev

3

如果您可以使用現代C++(例如C++ 11),則可以使用std::initializer_list。大多數現代編譯器都支持它,只需添加-std=c++11編譯標誌