문제

C++14에서는 템플릿으로 작성된 변수를 생성할 수 있습니다.일반적인 예는 다양한 유형에 대한 수학 상수 π의 값을 얻기 위해 읽을 수 있는 변수 'pi'입니다(3의 경우). int;가능한 가장 가까운 값 float, 등.)

게다가 템플릿 구조체나 클래스 내에서 변수를 래핑하는 것만으로도 이 기능을 사용할 수 있는데, 이것이 유형 변환과 어떻게 혼합됩니까?보니까 좀 겹치네요.

pi 예제 외에 const가 아닌 변수에서는 어떻게 작동합니까?이러한 기능을 최대한 활용하는 방법과 그 목적이 무엇인지 이해하는 사용 예가 있습니까?

도움이 되었습니까?

해결책

그리고 다른 pi 를 들어,그것이 어떻게 작업으로 비 const 변수가?

현재,그것은 보인 인스턴스화하는 변수에 대해 개별적으로 입력.즉,당신은 당신에 할당할 수 있습니 10 n<int> 것 다른 템플릿에서 정의합니다.

template<typename T>
T n = T(5);

int main()
{
    n<int> = 10;
    std::cout << n<int> << " ";    // 10
    std::cout << n<double> << " "; // 5
}

면 선언 const,그것은 읽기 전용입니다.의 경우 constexpr, 모 constexpr 선언하지 않은,많은 외부 사용 constexpr(ressions).

그 외에 우리는 이 기능을 포장하여 변수 내 템플릿 구조체하거나 클래스,이것은 어떻게 섞으 유형 변환?

그것이 의미하는 것은 간단하다.나는 볼 수 없는 방법에 영향을 미치 형식 변환에 중요한 방법입니다.나는 이미 언급된 유형의 변수가 형식의 인스턴스화 템플릿다.즉, decltype(n<int>) 이 int. decltype((double)n<int>) 더블 및니다.

모든 사용 예는 방법을 이해의 대부분을 만드는 이러한 기능이 고 그 목적이 무엇입니까?

N3651 제공하는 간결한 이론적 근거.

슬프게도,기존의 C++규칙이 허용하지 않는 템플릿을 선언 변수를 선언.거기에 잘 알려진 이러한 방법에 대해 문제:

•사용 constexpr 을 사용하여 정적 데이터 멤버들의 템플릿 클래스

•사용 constexpr 을 사용하여 기능 템플릿을 반환하고 원하는 값을

이러한 해결되었을 수십 년 동안 알고 잘 설명되어 있습니다.표준 클래스와 같은 std::numeric_limits 는 전형적 예입니다.하지만 이러한 방법은 완전하지 않다,그들의 단점 었 웬만한 어떤 정도이기 때문에 C++03 시대만,간단한 내장형 상수 즐길에 자유롭게 직접적이고 효율 컴파일 시간을 지원합니다.의 모든 변경의 채택과 constexpr 변수에서는 C++11,확장 직접적이고 효율 지하수 상수의 사용자 정의 형식입니다.이제 프로그래머 기 상수(클래스 형식의)더 명백하에서 프로그램입니다.그래서 성장하는 혼란 좌절감과 관련된 해결 방법이 있습니다.

...

주요 문제점으로"정적 데이터 구성원"은 다음과 같습니다:

•필"duplicate"선언:일단 클래스 템플릿,일단 클래스 외부에서 템플릿을 제공하"진짜" 정의한 경우에는 상수입니다 odr-사용됩니다.

•프로그래머들은 모두 miffed 과 혼란의 필요성에 의하여 제공의 두 번 동 선언입니다.반대로"일반"일정한 선언을 할 필요가 없 중복 선언이 있습니다.

...

잘 알려진 예는 이 범주에서는 아마 정원 의 기능 numeric_limits,또는 기능 등 boost::constants::pi<T>(), 니다,등등.Constexpr 을 사용하여 기능 템플릿지 고통"중복 선언"문제는 정적 데이터 구성원 이 있;또한,그들이 제공하는 기능을 추상화입니다.그러나,그들은 강제 프로그래머를 선택하는,사전에서 정의는 방법을 사이트 상수가 전달될:에 의해 하나 const 참조,또는 일반 non-reference 유형입니다.만약에 의해 전달되는 const 참조 다음 상수를 체계적으로 할당될 수에 정적장는 경우 비 reference 유형,다음 상수에 필요한 검사를 사용하지 않습니다.복사지 는 문제에 대한 종류 내장,하지만 그가 눈길을 사로잡한 사용자 정의 종류와 값을 의미하지 않는 그냥 래퍼 작 내장 유형(예를들면매트릭스,또는 정수,또는 bigfloat,etc.) By 반면,"일반"const(expr)변수로 고생하지 않에서 이 문제입니다.간단한 정의는 제공의 의사 결정 는지 여부를 상수로 할 필요가 레이아웃에서 저장소만 따라 달라집에 사용되지 않는 정의.

다른 팁

템플릿 구조체나 클래스 내에서 변수를 래핑하기만 하면 이 기능을 사용할 수 있습니다.

예, 하지만 그것은 불필요한 구문 솔트입니다.혈압에 건강하지 않습니다.

pi<double> 의도를 더 잘 전달한다 pi<double>::value.짧고 요점.이것이 내 책에서 이 구문을 허용하고 장려하는 충분한 이유입니다.

C++14의 변수 템플릿에 대한 또 다른 실용적인 예는 무언가를 전달하기 위한 함수가 필요한 경우입니다. std::accumulate:

template<typename T>
T const & (*maxer) (T const &, T const &) = std::max<T>;

std::accumulate(some.begin(), some.end(), initial, maxer<float>);

다음을 사용하여 std::max<T> 정확한 서명을 추론할 수 없기 때문에 부족합니다.이 특정 예에서는 다음을 사용할 수 있습니다. max_element 대신에 중요한 점은 이 동작을 공유하는 전체 함수 클래스가 있다는 것입니다.

지 궁금해 무언가가 이러한 라인을 따라 가능할 것이다:(가정의 가용성 템플릿 람다)

void some_func() {
    template<typename T>
    std::map<int, T> storage;

    auto store = []<typename T>(int key, const T& value) { storage<T>[key] = value; };

    store(0, 2);
    store(1, "Hello"s);
    store(2, 0.7);

    // All three values are stored in a different map, according to their type. 
}

지금 이것이 유용한가?

으로 간단한 사용을 알 수 있의 초기화 pi<T> 사용하여 명시적 변환(명시적으로 호출의 단항 생성자)및 균일하지 않 초기 설정입니다.즉,주어진 유형 radians 으로 생성자 radians(double), 작성할 수 있습니다 pi<radians>.

글쎄,이를 사용하여 컴파일 타임 코드를 작성할 수 있습니다 :

#include <iostream>

template <int N> const int ctSquare = N*N;

int main() {
    std::cout << ctSquare<7> << std::endl;
}
.

이는 동등한

에 대한 상당한 개선입니다.
#include <iostream>

template <int N> struct ctSquare {
    static const int value = N*N;
};

int main() {
    std::cout << ctSquare<7>::value << std::endl;
}
.

가변 템플리트가 도입되기 전에 템플리트 메타 프로그래밍을 수행하기 위해 템플리트 메타 프로그래밍을 수행하기 위해 쓰는 데 사용한

.비 유형 값의 경우 constexpr가있는 C ++ 11이므로이를 수행 할 수 있었으므로 템플릿 변수는 변수 템플릿에 유형을 기반으로 계산을 허용하는 이점이 있습니다.

tl; Dr : 그들은 우리가 전에 할 수없는 일을 할 수있게하지는 않지만, 템플릿은 피타의 덜 기반을 덜어줍니다.

여기에 유스 케이스가 있습니다.

template<typename CT> constexpr CT MARK = '%';
template<> constexpr wchar_t MARK<wchar_t> = L'%';
.

문자열 처리 템플리트에서 사용됩니다 .`

template <typename CT> 
void ProcessString(const std::basic_string<CT>& str)
{
    auto&& markpos = str.find(MARK<CT>);
    ...
}
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top