我尝试将此代码(c#代码)转换为c ++代码
public abstract class IGID<T>
where T : IGID<T>
如何在c ++中实现这样的模板条件?
答案 0 :(得分:4)
你能做的最好的事情是在一个空的基类中抛出一个static_assert
,它将在构造时触发。您必须延迟使用,因为所有类型都必须完成才能进行任何此类检查。
我们有断言对象:
template <typename C>
struct Require {
Require() {
static_assert(C::value, "!");
}
};
它是空的,所以不增加任何开销。然后我们有:
template<typename T>
struct IGID : Require<std::is_base_of<IGID<T>, T>>
{
};
即使T
在这里不完整,我们也不会检查任何内容,直到IGID<T>
构建完毕,所以我们还可以。
struct A : IGID<A> { }; // okay
可是:
struct B : IGID<int> { };
main.cpp:8:9: error: static_assert failed "!"
static_assert(C::value, "!");
^ ~~~~~~~~
main.cpp:13:8: note: in instantiation of member function 'Require<std::is_base_of<IGID<int>, int> >::Require' requested here
struct IGID : Require<std::is_base_of<IGID<T>, T>>
^