2015-12-11 3 views
3

Я хотел бы, чтобы класс имел функцию с аргументом шаблона, и на основе этого аргумента шаблона обрабатывается конкретная переменная-член.Может ли шаблонная функция C++ выбрать переменную-член?

Например, если шаблон функции специализация была разрешена, то что-то вроде этого:

struct A 
{ 
    struct M1 {}; 
    struct M2 {}; 

    // Function template specialization not allowed :(
    template<typename M> 
    void addM(M const &m); 

    template<> 
    void addM(M1 const &m) 
    { 
     m1_vec_.push_back(m); 
    } 

    template<> 
    void addM(M2 const &m) 
    { 
     m2_vec_.push_back(m); 
    } 

    std::vector<M1> m1_vec_; 
    std::vector<M2> m2_vec_; 
}; 

Любых идей? Я чувствую, что я пропустил что-то простое, но не могу на это положиться.

+2

Почему не были перегруженные функции, взять 'M1' и' M2'? –

+0

C++ позволяет легко пропустить дерево с деревьев. ;-) – 5gon12eder

+1

На боковой ноте функциональные шаблоны ** могут ** быть специализированными (полностью). Причина, по которой этот код выходит из строя, заключается в том, что они не могут быть специализированы в пределах класса. – SergeyA

ответ

9

Просто перегружать их:

struct A 
{ 
    struct M1 {}; 
    struct M2 {}; 

    void addM(M1 const &m) 
    { 
     m1_vec_.push_back(m); 
    } 

    void addM(M2 const &m) 
    { 
     m2_vec_.push_back(m); 
    } 

    std::vector<M1> m1_vec_; 
    std::vector<M2> m2_vec_; 
}; 

Если вы не хотите, чтобы дублировать код addM «s, вы можете просто абстрактный вектор выбор за другую функцию:

struct A 
{ 
    struct M1 {}; 
    struct M2 {}; 

    template <class T> 
    void addM(T const &m) 
    { 
     getVec<T>().push_back(m); 
    } 

    std::vector<M1> m1_vec_; 
    std::vector<M2> m2_vec_; 

private: 
    template<class T> 
    std::vector<T> &getVec(); 
}; 

template <> 
std::vector<A::M1> &A::getVec() { return m1_vec_; } 

template <> 
std::vector<A::M2> &A::getVec() { return m2_vec_; } 
+0

Второй ответ - это то, что я искал. Независимо от того, насколько я хорош на C++, это всегда поражает меня, насколько лучше некоторые люди. Thx за помощь! – user5406764