【发布时间】:2014-02-04 07:44:03
【问题描述】:
我基本上有一个 std::integral_constant 的模拟版本,其中包含一个变量,我想为这些从 Base<T> 派生的类专门化一个函数模板,如下所示:
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
}
以下是主要问题:
- 我不能将
value包含为模板,因为我期望T = double、float或其他一些非整数类型(否则我只会扩展std::integral_constant) - 我不能像
std::is_base<Base<T::type>,T>那样干净地使用std::is_base - 执行
foo(Base<T>&)不会让我看到value,我不想求助于虚拟value()函数(或反射)。 - 显然我希望避免为每个派生类专门设置 foo。
我认为答案在于使用is_base,但无论我如何尝试使用它,我都无法让它工作。我错过了更简单的方法吗?
【问题讨论】:
-
当然,你有一两个错字。
template<class T> struct A : Base{应该是template<class T> struct A : Base <T>{。这是你的全部问题吗? -
+1 用于清楚地表达首先 what 你想做什么,然后是 how 你想做什么,最后问如何你应该做你想做的事。
-
另外,请阅读this
-
我确定我在粘贴之前已经抓住了它,谢谢!但我很确定我需要专攻,因为我不想重载 Base 的每个子类型,也不能重载 Base
&.
标签: c++ templates c++11 template-specialization