我有一个元功能:
struct METAFUNCION
{
template<class T>
struct apply
{
typedef T type;
};
};
然后定义一个助手:
template<class T1, class T2>
struct HELPER
{
};
然后,我有了第二个元函数,它是从上面的METAFUNCTION派生的,并定义了应用结构的部分特化:
struct METAFUNCION2 : METAFUNCION
{
template<class T1, class T2>
struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
{
};
};
到目前为止,一切都很好-代码在g++ 4.3.2下编译。所以我像下面这样使用它:
#include <typeinfo>
#include <string>
#include <cstdlib>
#include <cxxabi.h>
template<typename T>
struct type_info2
{
static std::string name()
{
char *p = abi::__cxa_demangle(typeid(T).name(), 0, 0, 0);
std::string r(p);
free(p);
return(r);
}
};
#include <boost/mpl/apply.hpp>
#include <iostream>
int main()
{
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION, int>::type>::name() <<
std::endl;
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION, HELPER<float, double> >::type>::name() <<
std::endl;
std::cout <<
type_info2<boost::mpl::apply<METAFUNCION2, HELPER<float, double> >::type>::name() <<
std::endl;
return(0);
}
输出:
int
double
double
如我所料,这让我有些惊讶:
int
HELPER<float, double>
double
现在,我知道上面的代码无法在Microsoft Visual C++ 2008下编译(我不修改消息,但这是我无法擅长在METAFUNCTION2结构内部应用结构的东西)。
所以我的问题是-这种g++行为是否符合标准?我有一种强烈的感觉,这里出了点问题,但我不是100%确信。
出于好奇-以这种方式重新定义METAFUNCTION2时,我具有预期的行为:
struct METAFUNCION2 : METAFUNCION
{
template<class T>
struct apply : METAFUNCION::apply<T>
{
};
template<class T1, class T2>
struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
{
};
};
最佳答案
以下代码是非法的:
struct METAFUNCION2 : METAFUNCION
{
template<class T1, class T2>
struct apply<HELPER<T1, T2> > : METAFUNCION::apply<T2>
{
};
};
根据C++标准14.7.3 / 3:
编辑:根据Core Issue 727,此限制不适用于成员模板的部分特化。