gpt4 book ai didi

c++ - 如何对模板参数实现 child-of-X 限制?

转载 作者:可可西里 更新时间:2023-11-01 16:48:00 26 4
gpt4 key购买 nike

假设我想强制限制传入的模板参数是 Foo 的子参数。

有没有办法通过类型特征来强制执行此操作?编译时 static_assert失败会很棒。

在下面的代码中,让我们把它变成一个由两部分组成的(单独的)问题。

  1. 只允许My_Limited_Template<Bar>编译。
  2. 只允许My_Limited_Template<TBar>编译。

编辑我为错误的命名道歉:TBarTBaz有意成为非模板类​​。我只是在名称前面附加了 T,以消除与第 1 部分中类的歧义。

代码

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
};

最佳答案

我假设你在定义TBarTBas时出错,请检查我的修改是否正确。

#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"
);
};

关于c++ - 如何对模板参数实现 child-of-X 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14028437/

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