【问题标题】:Using a pointer to a function as a template parameter使用指向函数的指针作为模板参数
【发布时间】:2010-10-22 20:19:59
【问题描述】:

(C++) 我有许多 Entry 类,并且有 BaseProcessor 接口,它封装了 Entry 处理逻辑。 (见下面的代码)

条目不提供运算符

我可以使用函数指针来比较程序中的 Entry 实例。但是,我需要为 Entry 类创建 std::set (或 std::map 或其他使用 less() 的东西)。我尝试使用 std::binary_function 派生类将其传递给 std::set,但看起来我无法将函数指针值传递给模板。

我该怎么做? C++03可以吗?

谢谢。

struct Entry
{
  // ...
private: 
  bool operator< (const Entry &) const; // Should be defined by BaseProcessor.
};

typedef bool (*LessFunc)(const Entry &, const Entry &);

class BaseProcessor
{
public:
  // ...
  virtual LessFunc getLessFunc () const = 0;
};

// ...

BaseProcessor *processor = getProcessor();
LessFunc lessfunc = processor->getLessFunc();

Entry e1;
Entry e2;
bool isLess = lessfunc(e1, e2);  // OK

typedef std::set<Entry, ???> EntrySetImpl; // how to use lessfunc here?
EntrySetImpl entries;   

【问题讨论】:

    标签: c++ templates function-pointers


    【解决方案1】:

    你试过了吗?

    typedef std::set<Entry, LessFunc> EntrySetImpl;
    EntrySetImpl entries(lessfunc);
    

    注意,你需要将你的比较函数或对象的type指定为set的模板参数,然后给它一个比较函数的instance或实际创建集合时的对象。


    我将编辑我的答案以解决您的后续问题,因为它更容易一些。

    你可以这样定义一个模板:

    template <LessFunc func> class MyContainer { /*code*/ };
    

    但是,问题是,您必须指定一个特定 函数,而不是函数指针变量,作为模板参数。所以,例如,这是可以的:

    bool CompareEntries1(const Entry &, const Entry &);
    MyContainer<CompareEntries1> container;
    

    ...但这不行:

    bool CompareEntries1(const Entry &, const Entry &);
    LessFunc lessfunc = &CompareEntries1; //or any other way of getting a LessFunc
    MyContainer<lessfunc> container;
    

    如果你使用过数组模板类,比如boost::array,你可能以前见过这样的东西。例如,您可以编写array&lt;int, 10&gt; 来声明一个10 元素数组,但不能编写array&lt;int, abs(x)&gt;。数组的大小必须是编译器在编译程序时但在程序运行之前可以被告知的大小。 (关于允许的内容有一组非常具体的规则 - 即使编译器似乎应该能够计算出模板参数是什么,就像上面的 LessFunc 示例中一样,它仍然必须遵循特定规则。对于函数指针模板参数,参数必须是函数名,或者&amp;后跟函数名。)

    【讨论】:

    • 但是...看起来没有办法将函数指针值用作非类型模板参数。正确的?类似“模板 类比较器 {...} ”
    • @Roman - 对于您编写的课程,您也可以这样做,但 set 不能那样工作。但是,您指定为模板参数的 LessFunc 必须是编译时常量(例如,它不能是调用函数的结果)。
    • 我试过像这样使用我的比较器:“比较器比较器;”并得到错误“‘lessfunc’不能出现在常量表达式中”...
    • 好的,看起来我只能应用第一个解决方案。再次感谢您的解释。
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多