C++ 无法访问的if块中出现错误
我正在努力做到以下几点:C++ 无法访问的if块中出现错误,c++,templates,c++11,C++,Templates,C++11,我正在努力做到以下几点: template <class T> void foo(T * ptr){ ...a lot of code ... if(std::is_base_of<Bar<T>,T>::value){ Bar<T> & bar = *ptr; ...a lot of code ... } ...a lot of code } 模板 无效foo(T*p
template <class T>
void foo(T * ptr){
...a lot of code ...
if(std::is_base_of<Bar<T>,T>::value){
Bar<T> & bar = *ptr;
...a lot of code ...
}
...a lot of code
}
模板
无效foo(T*ptr){
…很多代码。。。
if(std::is_base_of::value){
Bar&Bar=*ptr;
…很多代码。。。
}
…很多代码
}
如果我用一个Bar的子类编译这个函数,一切都很好,但是如果我试着用一个非Bar的子类编译这个函数,我会得到一个错误
Bar<T> & bar = *ptr;
Bar&Bar=*ptr;
线路。
当T
不是Bar
的子类时,该行不应该执行,这将是一个怎样的问题?
如果这不是常见的方法,我如何才能以正确的方式实现呢?因为Bar
不是T
的子类
Bar<T> & bar = *ptr;
现在有了两个不同版本的foo
模板,一个用于模板参数为子类的情况,另一个不适用
两个版本的foo()
都可能有大量的通用代码。因此,您可能需要在这里做更多的工作,将公共代码分解成它们自己的独立模板函数,您将从foo()
s调用这些函数。因为Bar
不是T
的子类
Bar<T> & bar = *ptr;
现在有了两个不同版本的foo
模板,一个用于模板参数为子类的情况,另一个不适用
两个版本的
foo()
都可能有大量的通用代码。因此,您可能需要在这里做更多的工作,将公共代码分解成它们自己的独立模板函数,您将从foo()
s调用这些函数。这可以通过多种方式实现,例如标记分派:
template <class T>
void bar(T* ptr, std::true_type)
{
// ...a lot of code ...
}
template <class T>
void bar(T*, std::false_type)
{
// do nothing
}
template <class T>
void foo(T * ptr){
//...a lot of code ...
bar(ptr, std::is_base_of<Bar<T>,T>{});
//...a lot of code
}
模板
空心条(T*ptr,标准::真_型)
{
//…很多代码。。。
}
模板
空心条(T*,标准::假_类型)
{
//无所事事
}
模板
无效foo(T*ptr){
//…很多代码。。。
bar(ptr,std::is_base_of{});
//…很多代码
}
这可以通过多种方式实现,例如标签分派:
template <class T>
void bar(T* ptr, std::true_type)
{
// ...a lot of code ...
}
template <class T>
void bar(T*, std::false_type)
{
// do nothing
}
template <class T>
void foo(T * ptr){
//...a lot of code ...
bar(ptr, std::is_base_of<Bar<T>,T>{});
//...a lot of code
}
模板
空心条(T*ptr,标准::真_型)
{
//…很多代码。。。
}
模板
空心条(T*,标准::假_类型)
{
//无所事事
}
模板
无效foo(T*ptr){
//…很多代码。。。
bar(ptr,std::is_base_of{});
//…很多代码
}
“未执行”与“未编译”不同。它是一个模板,编译器必须为它生成代码,即使存在会停止模板初始化的条件。啊,好的,我明白了。但是我如何才能以正确的方式做到这一点呢?一种方法是使用enable\u,如果“未执行”与“未编译”不同。它是一个模板,编译器必须为它生成代码,即使存在会停止模板初始化的条件。啊,好的,我明白了。但是我如何才能以正确的方式做到这一点呢?一种方法是使用enable\u if
。