gpt4 book ai didi

c++ - 用于识别模板类中的类的元函数出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:53:02 26 4
gpt4 key购买 nike

我的代码结构如下:

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 会编译代码,但会发出警告并且元函数不起作用(始终为 false):

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 的解决方案就可以了。

最佳答案

对于我自己的问题,这是一个非常不优雅的解决方案,使用 TTI (http://svn.boost.org/svn/boost/sandbox/tti):

首先,给 Bar 添加一个虚拟标签:

template <typename T>
struct Foo
{
struct Bar
{
typedef void i_am_bar;
int data;
};
};

接下来,使用 TTI 检查该标签:

BOOST_TTI_HAS_TYPE(i_am_bar);

template <typename T>
struct is_bar : boost::tti::has_type_i_am_bar<T>
{};
...
BOOST_MPL_ASSERT(( is_bar<Foo<int>::Bar> ));
BOOST_MPL_ASSERT_NOT(( is_bar<Foo<int> > ));
BOOST_MPL_ASSERT_NOT(( is_bar<int> ));

确实令人讨厌,但它满足我的用例。

关于c++ - 用于识别模板类中的类的元函数出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com