2017-12-26 3 views
3

클래스를 고려, 푸, 나는 실제로 반환 형식이 템플릿 인 템플릿입니다 연산자 [] 과부하를 정의 할 , 그러나 나는 그것을 사용하는 방법을 알아낼 수 없습니다. 나는 그것을 호출 할 때 타입을 명시 할 곳을 모른다. 그럼 난 뭔가 할 수C++ 연산자의 템플릿 반환 형식은 []

class Foo 
{ 
    template<typename T> T at(size_t i) 
    { 
     return *(reinterpret_cast<T *>(get some pointer)); 
    } 
} 

: 참고 예를 제공하기 위해, 나는에서 함수 이름과 연산자 []를 대체한다고 가정

Foo foo; 

int myFooInt = foo.at<int>(32); // gets an int at position 32 

을이 컴파일하고 어떤 종류의 실제 구현을 제공 "일부 포인터 얻기"가 제공하는 위치 지정 메모리. 올바른 값을 리턴합니다. (참고로, "위치"가 의미하는 바에 대한 정보는 제공하지 않으며,이 경우에는 내 질문에 실제로 중요하지 않습니다.)

하지만 어떻게 []를 사용할 때 입력하십시오.

int myFooInt = foo.operator[]<int>(32); 

하지만 이런 일이 컴파일되지 않습니다 :

int myFooInt = foo[32]<int>; 

를도 않습니다이 : 그런데

, 다음 작업을 수행

int myFooInt = foo<int>[32]; 

무엇인가 I 가능하게하려고?

미리 감사드립니다.

+2

'foo.operator [] '이 이와 같은 템플릿을 사용하는 유일한 방법입니다. 다른 대안은 없습니다. –

+0

[std :: any] (http://en.cppreference.com/w/cpp/utility/any) 또는 [boost :: any] (http://www.boost.org/) 배열을 고려 했습니까? doc/libs/1_66_0/doc/html/any.html)? 당신의'Foo' 클래스는'std :: any'를 이미 수행하고있는 것처럼 보입니다. – PaulMcKenzie

+0

제안을 주셔서 감사합니다. 그러나이 경우 색인은 실제로 char 색인이며, 그 기준에 따라 오프셋을 계산 한 후에 만 ​​수행 된 반환 유형에 대한 유형 변환입니다. (즉, 제네릭 버퍼에 i 바이트로 저장된 int (또는 float 또는 기타)를 가져옵니다. –

답변

4

연산자 구문에 명시적인 템플릿 인수를 제공 할 수 없습니다. foo.at (ndx)는 그런 종류의 것을 원한다면 일반적인 대답입니다.