0

같은 템플릿의 모든 유형의 요소를 저장하는 벡터 만드는 방법 :내가 템플릿 클래스가 클래스

나는 표준을 만들
template<typename A, typename B, typename C> 
class blah{...}; 

: 벡터 <> 어쩌구의 가능한 모든 오브젝트를 저장을 . 예

blah<float, int, string> 

또는

blah<string, string, char> 

동일한 템플릿 클래스 유래되지만, 그 개체 ㅋ

는 본질적으로 다른 유형이다. 어떻게하면 표준을 선언하여 벡터를 모두 저장할 수 있습니까?

나는 표준 : 변형을 사용하는 방법에 대한 생각,하지만 그것을 사용하기 때문에, 나는 가능한 모든 템플릿 매개 변수의 조합을 열거 할 필요가 없습니다 : 내가 표준을 사용하여 : 어떤 생각

std::variant<all possible template parameter combinations> 

을 어떻게하면 표준 유형에서 캐스트를 입력 해야할지 모르겠다 :: 다시 모든 유형의 오른쪽으로? 다시 * 난 아직도 blah_base에서 캐스트를 입력하는 방법을 모른다, 다시

std::vector<blah_base*> 

하지만 :

나는 기본 클래스 사용에 대한 생각 :

template<typename A, typename B, typename C> 
class blah : public blah_base 
{...}; 

과 같은 벡터를 선언 올바른 유형으로?

+7

'blah <...>'인스턴스를 어떻게 사용합니까? 당신의 유스 케이스는 무엇입니까? 상속 및 가상 함수로 해결할 수 있습니까? 해결하려고하는 실제 문제는 무엇입니까? –

+0

'bla'의 정의를 제공 할 수 있습니까, 아니면 너무 길 수 있습니까? – skypjack

+0

저는 깊은 학습 신경 회로망을 구현하려고합니다. ㅋ 유형은 텐서입니다. 텐서는 다른 차원, 장치 유형 및 데이터 유형을 가질 수 있습니다. 그래서 진정한 의미는 "template class {...};" –

답변

0

글쎄, 당신의 유스 케이스가 무엇인지에 대해 너무 많이 알지 못한다면 나는 당신이 3 개의 벡터를 가질 것이라고 가정 할 것이다. 각 템플릿 유형마다 하나씩.

#include <vector> 

template<typename A, typename B, typename C> 
class blah 
{ 
public: 
    // Put stuff here. 
    void AddToVectorA(A item); 
    void AddToVectorB(B item); 
    void AddToVectorC(C item); 
private: 
    std::vector<A> _a; 
    std::vector<B> _b; 
    std::vector<C> _c; 
}; 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorA(A item) 
{ 
    _a.push_back(item); 
} 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorB(B item) 
{ 
    _b.push_back(item); 
} 

template<typename A, typename B, typename C> 
void blah<A,B,C>::AddToVectorC(C item) 
{ 
    _c.push_back(item); 
} 

int main() 
{ 
    blah<int, double, float> b; 
    b.AddToVectorA(2); 

    return 0; 
} 

당신은 또한 세 벡터를 공개 할 수있는 사람들은 그들을 그러나 사용할 수 있습니다 : 당신은 같은 blah을 구현할 수 당신은 또한 tuple을 들여다 볼 수 있습니다. 참고 : 코드를 테스트 한 결과 작동합니다.

+0

여기에서 볼 수 있습니다. 제 문제는 유형의 조합이 거대하고, 나는 단지 3 가지가 아니라 많은 벡터가 필요할 것입니다. –

1

기본적으로 필요한 것은 다형성입니다. 탐구했던 모든 옵션은 다형성이며 이것이 이것이 해결되는 최선의 방법입니다. 당신은 자신이 작업을 수행 할 필요 찾아내는 경우에, 당신이하고있는

내가 올바른 형식으로 다시 * blah_base에서 캐스트를 입력하는 방법을 알고하지 않습니다하지만 당신은 이것과 다른 변화를 말한다 뭔가 잘못. std::vector<blah<...>>을 가지고 있거나이 모든 것이 blah_base 계약을 충족해야합니다.

당신은 가상 함수와 함께이 문제를 해결할 수 :

class blah_base { 
public: 
    virtual void foo() = 0; 
}; 

을 그리고, 오히려, 당신은 당신이 원하는 것을 그 적절한 foo 함수를 호출 할 거라고했던 blah의 유형을 말할 필요없이.

+0

"나는 뭔가 잘못하고 있습니다"라고 생각하지 않습니다. C++에는 "반영"기능이 없다고 생각합니다. https://root.cern.ch/blog/status-reflection-c –

+0

이것을 참조하십시오. 그것은 C++ 1z에 반영이 있는지 나에게는 명확하지 않습니다. https://news.ycombinator.com/item?id=8651990 –