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 でコンパイルされるようですが、私は彼らのオンライン テストにしかアクセスできないので、期待どおりに機能すると仮定して立ち往生しています。
実際の型を構造体に直接渡し、それをテンプレート型に分解する方法はわかりませんでしたが、関数パラメーターを推測する必要がある場合、コンパイラーは問題なく 2 つを削除しました。boost::result_of
おそらく、これはの代わりにC++03 を使用して動作しますがdecltype
、これまで使用したことがないので、知っていることに固執すると考えました。
内の間隔に注意してくださいmain
。 有向グラフであるRebind<::Template, float>::NewType
ため、パーサーによってむさぼり食われます。<:
に変わると思いますRebind[:Template, float>::NewType
。そのため、前のスペース::Template
は非常に重要です。
余談ですが、ネストされたテンプレート パラメーターが typename [template<template<typename> class T>
ではなくtemplate<template<typename> typename T>
] を使用できないとは思いもしませんでした。構成の構文を覚えようとするたびに、それを再学習したと思います。