使用 C++0x:
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;
}
使用 gcc45 产生
void PrintType() [with T = <unnamed>::Template<int>]
void PrintType() [with T = <unnamed>::Template<float>]
显然它与 Cormeau 一起编译,但我只能访问他们的在线测试,所以我只是假设它按预期运行。
我想不出任何方法可以将实际类型直接传递给结构并将其降级为模板类型,但是当编译器必须猜测函数参数时,它可以毫无问题地剥离这两者。也许这可以在 C++03 中使用boost::result_of
而不是decltype
,但我以前从未使用过它,所以我想我会坚持我所知道的。
注意 内的间距main
。 由于是有向图而被Rebind<::Template, float>::NewType
解析器吞噬。<:
我认为它会变成Rebind[:Template, float>::NewType
. 所以前面的空间::Template
是至关重要的。
顺便说一句,我不知道嵌套模板参数不能使用 typename [template<template<typename> class T>
而不是template<template<typename> typename T>
]。我想我每次尝试记住构造的语法时都会重新学习。