将通用代码从c#转换为模板c ++

时间:2015-09-26 19:35:49

标签: c# c++ templates generics

我尝试将此代码(c#代码)转换为c ++代码

public abstract class IGID<T>
    where T : IGID<T>

如何在c ++中实现这样的模板条件?

1 个答案:

答案 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>>
       ^