我有以下结构的代码:
template <typename T>
struct Foo
{
struct Bar
{
int data;
};
};
我想编写元函数来告诉我类型是 Foo 还是 Bar。第一个很简单:
template <typename T>
struct is_foo : boost::mpl::false_
{};
template <typename T>
struct is_foo<Foo<T> > : boost::mpl::true_
{};
...
BOOST_MPL_ASSERT(( is_foo<Foo<int> > ));
BOOST_MPL_ASSERT_NOT(( is_foo<int> ));
但是,同样的方法不适用于 Bar:
template <typename T>
struct is_bar : boost::mpl::false_
{};
template <typename T>
struct is_bar<typename Foo<T>::Bar> : boost::mpl::true_
{};
此代码被编译器拒绝。海湾合作委员会 说:
main.cpp:38:8: error: template parameters not used in partial specialization:
main.cpp:38:8: error: ‘T’
奇怪的是,clang 会编译代码,但它会发出警告并且元函数不起作用(总是错误的):
main.cpp:38:8: warning: class template partial specialization contains a template parameter that can not be deduced;
this partial specialization will never be used
struct is_bar<typename Foo<T>::Bar> : boost::mpl::true_
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
main.cpp:37:20: note: non-deducible template parameter 'T'
template <typename T>
^
这个问题有解决方法吗?特定于 c++11 的解决方案会很好。