2012-01-31 5 views
1

가변 템플릿에 대한 기본 인수를 가질 수 없다는 결정 뒤에 합리적인 근거가 있는지 아는 사람 있습니까? 상상하기가 어렵지 않습니다.기본 variadic 템플릿을 가질 수없는 이유

template<class T, class... Policies = Default_Policy> 
class X 
{ 
}; 
+1

맹세로 인해 불편을 끼쳐 드려 죄송합니다. –

답변

1

주어진 인수가 다를 경우 기본 인수를 사용하는 것이 혼란 스럽습니다. 예를 들어, 템플릿을 인스턴스화 할 때이 기본값을 사용하겠다고 컴파일러에 알리는 방법은 무엇입니까? 어떻게 컴파일러는 등의 이름이 "기본 default_policy"를 사용하여 명시 적으로하지 않고

X<T, Default_Policy> 

또는

X<T, Default_Policy, Default_Policy> 

를 원한다면 알아?

이것은 (최소한 내 의견으로는) variadic 템플릿에 대한 기본 인수가없는 좋은 이유입니다.

2

매개 변수 팩에 0 개의 값을 포함하는 것이 유효합니다. 컴파일러는 사용자가 X<T>을 쓸 때 어떻게 선택해야합니까 : Policies = {} 또는 Policies = {Default_Policy}?

(그리고 당신의 구문이 1 개 이상의 항목을 디폴트 값을 허용하지 않지만, 그건 그냥 구문입니다.)

+0

"parameter pack"이란 용어가 실제로 이것을 설명하기 위해 실제로 존재합니까? 일반적으로 알려져 있습니까? 인터넷 검색은 아무것도 찾지 못했고 나는 그것을 들어 본 적이 없었습니다. –

+2

@KonradRudolph : 일반적인 경우 확실하지 않지만 적절한 용어입니다 (n3290 §14.5.3/3). – kennytm

+0

# KennyTM 여러 값을 허용합니다. Policies = {P1, P2, P3} – smallB

0

당신은 기본 인수를 위해 새로운 언어 기능이 필요하지 않습니다. 전문화와 템플리트 별명으로 충분합니다.

template<template<typename...> class t, typename def, typename... a> 
struct give_default { 
    using type = t<a...>; 
}; 
template<template<typename...> class t, typename def> 
struct give_default<t, def> { 
    using type = t<def>; 
}; 

template<typename... t> 
using X_with_default = typename give_default<X, Default_Policy, t...>::type; 
+0

#Pubby, 오, 알겠습니다. 당신이 증명 한 것처럼 더 단순하고/더 좋고/더 자연스러운 방법이 존재한다는 것을 깨닫지 못하고 약간의 미친 구문을 읽을 수있었습니다 (Policy = {P1, P2, P3}). 나는 정말로 어리 석다. – smallB

관련 문제