【问题标题】:C++ Identify template argumentsC++ 识别模板参数
【发布时间】:2015-12-07 20:32:47
【问题描述】:

我想知道有没有办法识别模板参数?例如,假设我想根据模板参数初始化一个变量。原型示例如下

template<class T> 
      void initialise(T a)
      {
        if(T==int)a=0;
        else if(T=double)a=0.0;
        else if(T=complex<double>)a=T(0.,0);
        else print("unknown type"); 
      }

我的问题是如何识别模板参数“T”?或者,我需要借助预处理器指令吗?这可能是一个重复的问题,但我没有找到答案。任何形式的建议将不胜感激。

【问题讨论】:

  • 为什么不能使用模板专业化来做到这一点?
  • 你真的需要print吗?还要注意你的函数没有任何作用。
  • 不,我不需要打印。这只是一个例子。
  • @musafir 好的,那么我的回答可能适用。

标签: c++ templates arguments c-preprocessor


【解决方案1】:

这是使用函数模板将参数“重新设置”为零的方式:

template<class T> 
void initialise(T& a)
{
  a = T(); // or T{};
}

如果要将其限制为算术类型,可以使用 SFINAE 和 std::is_arithmetic(浮点和整数类型),以及 std::complex 的特化。

template<class T> 
typename enable_if<std::is_arithmetic<T>::value, void >::type
void initialise(T& a)
{
  a = T();
}

template<class T>
void initialise(std::complex<T>& a)
{
  a = T();
}

【讨论】:

  • 可能我选择了一个非常糟糕的例子来表达我的想法。但是,我从这个讨论中得到了解决我的实际问题的想法。谢谢各位,
【解决方案2】:

您可以使用模板特化。类似的东西:

template<class T> 
void initialise(T a)
{
    print("unknown type"); 
}

template<> 
void initialise<int>(int a)
{
    a=0;
}

template<> 
void initialise<double>(double a)
{
    a=0.0;
}

template<> 
void initialise<complex<double>>(complex<double> a)
{
    a=complex<double>(0.,0);
}

当然,这些功能没有多大意义,但我想这是因为你试图提出一个最小的例子。

【讨论】:

  • 谢谢,我想我明白了。
  • 重载会容易得多。另见gotw.ca/publications/mill17.htm
  • 当然可以,但是我们必须从 OP 的示例开始,我已经给出了仍然涉及模板的解决方案。我不能假设哪个是真正的问题,我必须假设提出的问题是一个最小的简化示例。