【问题标题】:C++: Giving unknown class variable to template [closed]C ++:将未知的类变量提供给模板[关闭]
【发布时间】:2013-04-01 12:53:35
【问题描述】:

我有一个 ABC 类,我想给它的模板一个未知的类变量,就像这样:

template < v >
class ABC
{
// do something
};

当然上面的代码不起作用(没有参数类型v)。你有什么想法来解决这个问题吗?我不想将变量类型 v 提供给模板。

有两种功能,类型不同。如何在下面的类模板中使用这两个函数?

#include <iostream>
using namespace std;
// Types of functions max1 and min1 are different!
int max1(int a, int b){ return a>b?a:b; }
int& min1(int a, int b){ return a<b?a:b; }

template<typename _T, _T(function)(_T,_T)>
class ABC
{
      public:
      _T a, b;
      _T get()
      {
                 return function(a, b);       
      }        
};

ABC <int, max1> abc; // <- If You write "ABC <int, min1> abc;", error comes! How fix this?

int main()
    {
    abc.a = 3;
    abc.b = 8;
    cout << abc.get() << '\n';      
    cin.get();      
    return 0;      
    }

【问题讨论】:

  • 我不明白。如果您向我们展示您想如何使用它,也许会有所帮助。
  • 也许您似乎认为变量是在template&lt;...&gt; 中声明的,而函数体是放在类体中的?
  • 如果你把 _T (function)(_T, _T) 改成 _T(*)(_T, _T) 有什么改变吗?
  • Err,你正在做的事情是不可能的。唯一可以进入模板列表的是类型和整数常量。 max1 既不是类型也不是常量。

标签: c++ templates


【解决方案1】:

好像无关紧要,不过一开始问题很不清楚……

template < v >

必须

template < typename v >

template < class v >

typename 更可取。


关于您的编辑:问题是,min1 返回&amp;。如果你删除它,那么你可能有:

#include <iostream>

int max1(int a, int b){ return a>b?a:b; }
int min1(int a, int b){ return a<b?a:b; }

template<typename _T, _T(*function)(_T,_T)>
class ABC
{
public:
      _T a, b;
      _T get() { return function(a, b); }        
};

int main()
{
    ABC <int, max1> abc;
    ABC <int, min1 > def;

    abc.a = def.a = 3;
    abc.b = def.b = 8;

    std::cout << abc.get() << '\n';
    std::cout << def.get() << '\n';      

    return 0;      
}

这将打印8 3

【讨论】:

  • 在这种用法中,typename 严格等同于class,虽然我也更喜欢typename
  • 是的,在这种情况下完全一样。这就是我写“首选”的原因
  • 我要给出变量,而不是变量的类型。
  • @greego - 也许你应该举例说明你的意思。显然,没有人理解你的问题。
  • @KirilKirov 我在上面编辑了我的帖子。我想使用 both 函数,但是它们的类型不同。这是怎么做到的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2019-02-23
相关资源
最近更新 更多