2017-05-08 111 views
1

在我写的构造函数模板中,我希望在类模板的接口上有一个静态断言。情况基本(非编译)示例如下:类模板接口的静态断言

class Baz 
{ 

} 

template<typename T> 
class Bar: public Baz 
{ 

} 

template<typename T> 
class Qux: public Baz 
{ 

} 

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // here I would like to assert that Baz is an interface to a class 
     specialized on T 
    } 
} 

我最好的猜测是一个函数来巴兹的增加,但因为这不能作为模板,我不会现在我怎么能调用,在编译时间。

+1

你的意思是你想在编译时检查'Baz'实际上是对'Bar '或'Qux '的引用吗?这是不能做到的,因为动态类型的'baz'在运行时可能是不同的东西。 – TartanLlama

+0

您可以将'Baz&'更改为模板参数,然后执行检查,但是您无法将'Baz'传递给您的构造函数,您需要首先进行投射。 – TartanLlama

+0

我明白你的意思了。将它改为模板参数对我来说不是一个真正的选择。于是我只想放弃这个静态断言 – laurisvr

回答

-1

如果你想“......断言Baz是专门在T一类的接口”,如果我可以将其解释为“......断言TBaz一超”,那么你就可以static_assert此如下:

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // assert that T is a base class of Baz 
     static_assert(std::is_base_of<T, Baz>::value, "T is not a base class of Baz."); 
    } 
}; 

这也适用于的Baz任何亚类中,因为传递性的(如果TBaz超类,那么T也是Baz每个子类的类的超类)。

但是请注意,你不能静态地断言对函数参数baz什么,因为函数的参数不能是常量表达式。

+0

我不认为你的理解是正确的。你可以看到'Baz'不从任何继承。OP希望确保动态类型Baz'的''是酒吧'或'Qux ',但你可以在编译时不会这样做。 – TartanLlama