+ +0 : 분명히 그것은 Cormeau으로 컴파일하지만 난 단지 온라인 테스트에 액세스 할 수있는, 그래서 '
void PrintType() [with T = <unnamed>::Template<int>]
void PrintType() [with T = <unnamed>::Template<float>]
를 산출 gcc45와
namespace {
template<class T> struct Template { };
}
typedef Template<int> Template;
#include<iostream>
template<typename T>
void PrintType() {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
template<typename FullType, typename NewParameter>
class Rebind {
template<template<class> class Template, typename OldParameter>
static Template<NewParameter> function(Template<OldParameter>);
public:
typedef decltype(function(FullType())) NewType;
};
int main()
{
PrintType< ::Template>();
PrintType<Rebind< ::Template, float>::NewType>();
return 0;
}
그냥 예상대로 작동한다고 가정합니다.
구조체에 실제 형식을 직접 전달하고 템플릿 형식으로 변환하는 방법을 찾지 못했지만 컴파일러는 함수 매개 변수를 추측해야 할 때 두 가지를 제거하는 데 아무런 문제가 없었습니다. 어쩌면 이것은 C++ 03에서 decltype
대신에 boost::result_of
을 사용하지만, 전에는 사용 해본 적이 없기 때문에 내가 아는 것에 집중할 것이라고 생각했습니다.
간격은 main
입니다.변이가 <:
이기 때문에 Rebind<::Template, float>::NewType
은 파서에 의해 도깨비가됩니다. 나는 그것이 Rebind[:Template, float>::NewType
으로 바뀌 었다고 생각한다. 따라서 ::Template
전의 공간이 중요합니다.
제쳐두고 중첩 된 템플릿 매개 변수는 template<template<typename> typename T>
이 아닌 [template<template<typename> class T>
]을 사용할 수 없다는 것을 알았습니다. 나는 구문에 대한 구문을 기억하려고 할 때마다 그 점을 다시 읽었다 고 생각합니다.
실용적인 것보다 재미있는 호기심 질문이 더 많기 때문에 커뮤니티 위키로 만들고 있습니다. :) –
모든 clang/gcc/comeau에서 컴파일되는 두 번째 문제에 대한 해결책은 적어도 하나 있지만 * 찾기가 더 어려워졌습니다. –
완전히 생각할 시간이 없습니다. ,하지만 할당 자들이 템플릿 매개 변수를 변경하는 데 사용하는 트릭을 가지고 있지 않습니까? 여기에서 비슷한 것을 할 수 있고, Rebind <:: Template, float> :: type' 라인을 따라 뭔가를 끝낼 수 있습니까? 그런 식으로,'Template'은'Rebind' 안에서'T'라고 이름이 바뀔 것이고, 모호성은 없습니다. –