는 가장 좋은 방법은 튜플을 사용하는 것입니다. 또 다른 중요한 점은 그들에게 명명 된 접근을하는 것일 수도 있습니다.나는 당신이 달성하려고하는 것은 독특한 유형의 여러 벡터를 가지고하는 것입니다 생각, 그래서 당신은 그 값 유형에 따라 정확한 벡터에 대해 "검색"할 수있는 다음과 같은 기능이 있습니다 :
다음
template <class T1, class T2>
struct SameType
{
static const bool value = false;
};
template<class T>
struct SameType<T, T>
{
static const bool value = true;
};
template <typename... Types>
class MyClass
{
public:
typedef std::tuple<vector<Types>...> vtype;
vtype vectors;
template<int N, typename T>
struct VectorOfType: SameType<T,
typename std::tuple_element<N, vtype>::type::value_type>
{ };
template <int N, class T, class Tuple,
bool Match = false> // this =false is only for clarity
struct MatchingField
{
static vector<T>& get(Tuple& tp)
{
// The "non-matching" version
return MatchingField<N+1, T, Tuple,
VectorOfType<N+1, T>::value>::get(tp);
}
};
template <int N, class T, class Tuple>
struct MatchingField<N, T, Tuple, true>
{
static vector<T>& get(Tuple& tp)
{
return std::get<N>(tp);
}
};
template <typename T>
vector<T>& access()
{
return MatchingField<0, T, vtype,
VectorOfType<0, T>::value>::get(vectors);
}
};
인을 테스트 케이스 당신이 그것을 시도 할 수 있습니다 : 당신은 당신이 MyClass의 전문에 전달 유형의 목록에없는 모든 유형을 사용하는 경우
int main(int argc, char** argv)
{
int twelf = 12.5;
typedef reference_wrapper<int> rint;
MyClass<float, rint> mc;
vector<rint>& i = mc.access<rint>();
i.push_back(twelf);
mc.access<float>().push_back(10.5);
cout << "Test:\n";
cout << "floats: " << mc.access<float>()[0] << endl;
cout << "ints: " << mc.access<rint>()[0] << endl;
//mc.access<double>();
return 0;
}
가 (더블이 주석 처리 된 액세스 참조), 당신은 얻을 것이다 컴파일 에러, 너무 읽기 어렵지는 않지만 gcc는 적어도 문제를 야기한 정확한 위치를 가리키고 적어도 그러한 에러 메시지는 제안한다. 문제의 정확한 원인 - 여기, 예를 들어, 당신은 mc.access < 더블 >()하려고 노력하는 경우 : 당신은 [`표준 : tuple`]에 인수 유형을 전달할 수 있습니다
error: ‘value’ is not a member of ‘MyClass<float, int>::VectorOfType<2, double>’
을 (http://en.cppreference.com/w/cpp/utility/tuple). –
별도의 멤버 여야합니까, 아니면 벡터 모음을 가지고 있을까요? 예 : 벡터의'std :: array'? [어느 쪽이든 해결하는 방법을 모르지만이 질문에 대한 답은이를 해결하는 방법을 알고있는 사람들을 도울 것입니다.] –
컬렉션도 좋습니다. 그게 도움이 될지 확신 할 수는 없지만. 어떤 시점에서 컨테이너 (std :: vector)는 형식을 알아야합니다. – user1101674