假设我想强制传入的模板参数是Foo的子级的限制。
有没有办法通过类型特征强制执行此操作?编译时static_assert
失败会很棒。
在下面的代码中,让我们把它作为一个由两部分组成的(单独的)问题。
My_Limited_Template<Bar>
进行编译。My_Limited_Template<TBar>
进行编译。 修改
我为错误的命名道歉:TBar
和TBaz
意图是非模板类的目的。我只是在名字前面加上T来消除第1部分中的类的歧义。
CODE
struct Foo { }; // no
struct Bar : public Foo { }; // yes
struct Baz { }; // no
template< typename T >
struct TFoo { }; // no
struct TBar : public TFoo<TBar> { }; // yes
struct TBaz { }; // no
template< typename T >
struct My_Limited_Template
{
// Part One:
// My_Limited_Template<Foo> // disallow
// My_Limited_Template<Bar> // allow
// My_Limited_Template<Baz> // disallow
//
// Part Two:
// My_Limited_Template<TFoo<int>> // disallow
// My_Limited_Template<TBar> // allow
// My_Limited_Template<TBaz> // disallow
};
答案 0 :(得分:1)
我假设您在TBar
和TBas
的定义中出错,请检查我的修改是否正确。
#include <type_traits>
struct Foo { }; // don't allow this
struct Bar : public Foo { }; // allow this
struct Baz { }; // don't allow this
template< typename T > struct TFoo { };
template< typename T > struct TBar : public TFoo<TBar<T>> { };
template< typename T > struct TBaz { };
template< typename T >
struct My_Limited_Template
{
static_assert(
(std::is_base_of<Foo,T>::value && !std::is_same<T,Foo>::value)
||
(std::is_base_of<TFoo<T>,T>::value && !std::is_same<T,TFoo<T>>::value),
"fail2"
);
};