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