Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板化派生类的专用函数模板_C++_Templates_C++11_Template Specialization - Fatal编程技术网

C++ 模板化派生类的专用函数模板

C++ 模板化派生类的专用函数模板,c++,templates,c++11,template-specialization,C++,Templates,C++11,Template Specialization,我基本上有一个模拟版本的std::integral_constant,其中包含一个变量,我想专门化从Base派生的这些类的函数模板,如下所示: template<class T> struct Base{ typedef T type; T t; }; template<class T> struct A : Base<T>{ static constexpr T value = 1; }; template<class T> str

我基本上有一个模拟版本的
std::integral_constant
,其中包含一个变量,我想专门化从
Base
派生的这些类的函数模板,如下所示:

template<class T> struct Base{
  typedef T type;
  T t;
};

template<class T> struct A : Base<T>{
  static constexpr T value = 1;
};
template<class T> struct B : Base<T>{
  static constexpr T value = 2;
};

struct Unrelated{};

// etc.

template<class T> void foo(T t){
  //I would like to specialize foo for A and B and have a version for other types
}


int main(){
  foo(A<float>());//do something special based on value fields of A and B
  foo(B<float>());
  foo(Unrelated()); //do some default behavior
}
模板结构库{
T型;
T;
};
模板结构A:Base{
静态constexpr T值=1;
};
模板结构B:Base{
静态constexpr T值=2;
};
结构无关{};
//等等。
模板无效foo(T){
//我想专门为A和B的foo,并有一个其他类型的版本
}
int main(){
foo(A());//根据A和B的值字段执行一些特殊操作
foo(B());
foo(unrelative());//执行一些默认行为
}
以下是主要问题:

  • 我不能将
    value
    作为模板,因为我希望
    T=double
    float
    或其他一些非整数类型(否则我只会扩展
    std::integral\u常量
  • 我不能像我必须做的那样干净地使用
    std::is_base
  • foo(Base&)
    不允许我看到
    value
    ,我也不想求助于虚拟的
    value()
    函数(或反射)
  • 显然,我希望避免为每个派生类专门化foo

我认为答案在于使用
is_base
,但无论我如何尝试使用它,我都无法让它正常工作。有没有一种更简单的方法是我所缺少的?

以下方法应该有效:

template<typename,typename = void>
struct IsBase
  : std::false_type {};

template<typename T>
struct IsBase<T, typename std::enable_if<
                   std::is_base_of<Base<typename T::type>,T>::value
                 >::type>
  : std::true_type {};

template<class T>
typename std::enable_if<IsBase<T>::value>::type foo(T t){
    // use T::value
}

template<class T>
typename std::enable_if<!IsBase<T>::value>::type foo(T t){
    // general case
}
模板
结构IsBase
:std::false_type{};
模板
结构IsBase::类型>
:std::true_type{};
模板
typename std::enable_if::type foo(T){
//使用T::value
}
模板
typename std::enable_if::value>::type foo(T){
//一般情况
}

当然,你有一两个打字错误<代码>模板结构A:Base{应该是
模板结构A:Base{
。这就是你的全部问题吗?+1首先清楚地表达了你想做什么,然后是你想怎么做,最后问你应该怎么做你想做的。另外,阅读我确信我在粘贴它之前就抓住了这一点,谢谢!但我非常确定我需要专门化,因为我不希望每个子都超负荷如果我使用
foo()
(至少对我来说是在g++4.6上),即使它没有在
typename t::type失败的问题,
就像我说的,我做了几乎相同的事情,但还不能让它完全按照我的意愿工作。@user783920
foo()
不提供参数,但
foo
(如您所定义)需要参数
t
。如果您不提供问题的正确描述,我想我帮不了忙。我已删除了模板,但现在它可以工作了。我想我忘了保存或其他什么,对不起。