2016-10-17 2 views
1

내가 예상하는 클래스 A을 정의 할 유형 T과 템플릿 인수로 size_t와 N_i...의 임의의 수 :size_t 템플릿 인수를 함수 서명 스타일로 전달하는 방법은 무엇입니까?

template< typename T, size_t... N_i> 
class A 
{ 
    // ... 
}; 

에 따르면 위 (고화질)의 A에, 나는 A에 템플릿 인수를 전달해야 형태 A<float,1,2,3> a에 (T=floatN_i...=1,2,3의 예를 들어, 경우에), 그러나, 더 나은 읽기 가, 내가 (함수의 시그니처 스타일) 구문을 선호하는 것, 즉, size_t로 값이 괄호로 전달됩니다 A<float, (1,2,3)> a. 아무도 이것이 어떻게 구현 될 수 있는지 알고 있습니까?

미리 감사드립니다.

+4

아니요, C++ 템플릿에서 정확한 구문을 사용할 수 없습니다. 당신은 타협해야합니다. – milleniumbug

+1

매크로'#define NS (...) __VA_ARGS__', 그리고'A a;'... – Jarod42

답변

0

C++에서 정확히 구문을 사용할 수 없습니다 (괄호로 묶인 목록은 쉼표 연산자를 포함하는 식으로 마지막 값과 같습니다).

편집 다음 초안은 작동하지 않습니다. 대략 형식이 아닌 매개 변수는 정수/열거 형, 참조 또는 포인터 일종이어야합니다. 실제 전체 목록은 this list을 참조하십시오.

대신 중괄호를 받아 들일 준비하는 경우 :

template< typename T, std::initializer_list<size_t> N_i> 
class A 
{ 
    // ... 
}; 

A<float, {1,2,3}> a; 

편집 을 당신이로 변경하여 작동하도록 강제 할 수 있습니다 :

template< typename T, const std::initializer_list<size_t> *N_i> 
class A 
{ 
    // ... 
}; 

const std::initializer_list<size_t> a_arg{1,2,3} 
A<float, &a_arg> a;  

그러나이 휴식 "가독성"끔찍 .

쉼표 연산자를 사용하는 마법 유형이 포함 된 다른 복잡한 솔루션이 있지만 a) 템플릿 인수로 받아 들일 수 있도록 만드는 것이 어렵습니다. b) 가독성은 당신이 시작한 것보다 더 나을 것입니다.

+0

아니요, 유효한 템플릿이 아닌 형식이 아닙니다. 매개 변수 유형. –

+0

바하마! 왜 성가신 사실을 좋은 생각으로 만들 수 있습니까? –

+0

@ T.C .: 고정 (ish) –

관련 문제