【问题标题】:Generic template non-type arguments通用模板非类型参数
【发布时间】:2013-02-05 15:20:15
【问题描述】:

我希望我的类接收非类型模板参数,但我不想指定非类型参数的类型。我可以通过写作来做到这一点:

template<class Type, Type param>
class A
{};

然后可以按如下方式使用:

A<int,3> a;

这是多余的,因为一旦我知道param = 3,我就会知道Type = int。有没有什么方法可以这样写,以便以下所有行编译和实例化不同的类型?

A<3> a;
A<3.0> b;
A<3.0f> c;

【问题讨论】:

  • @R.MartinhoFernandes 在您的评论中,我的屏幕上有 6 个方块。穿着他的长袍和巫师帽。
  • @Aniket 我需要一个填充符来满足至少 15 个字符的要求。我使用香蕉i.stack.imgur.com/DvRWZ.png,因为 SO 将每个都视为两个字符。

标签: c++ templates


【解决方案1】:

不,那是不可能的。所有非类型模板实参的类型必须在形参中定义,并且永远不能从使用中推断出来,即编译器分析实参Type param时需要Type已知 .

【讨论】:

  • @BenjyKessler:很多其他人也遇到过同样的问题,包括我和我周围一些非常聪明的人。
【解决方案2】:

如果A 是一个函数对象,您可以将一个函数模板成员放在一个常规类中

class A  
{  
public: 
    template<class Type> 
    void operator()(Type param) { }  
};

或将类模板包装在函数模板中

template<class Type> 
class A  
{  
public: 
    void operator()(Type param) { }  
};

template<class Type>
void fun(Type param) 
{ 
    A<Type>()(param); 
}

并将其称为A()(3)fun(3) 将推断Typeint,其他类似。这是因为函数模板确实推导出了它们的参数,但对于类模板则不然。因此,如果您将类模板 A 用于函数对象以外的其他目的,则需要指定其参数。

【讨论】:

  • 谢谢,我不使用 A 作为函数对象,但将来知道这一点很好。
  • @BenjyKessler 我稍微更新了它,因为函数模板可以在类内部或外部。类和函数模板之间的区别很大程度上是历史性的,参见例如此question 用于相关方面。
猜你喜欢
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多