代码之家  ›  专栏  ›  技术社区  ›  Rom098

使用指向函数的指针作为模板参数

  •  0
  • Rom098  · 技术社区  · 15 年前

    (C++)我有许多入门类,有基本的处理器接口,它封装了输入处理逻辑。(见下面的代码)

    条目不提供运算符<()。BaseProcessor提供了一个指向less(Entry,Entry)函数的指针,该函数特定于特定的BaseProcessor实现。

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

    谢谢。

    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;   
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Doug    15 年前

    你试过这个吗?

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

    注意,您需要指定 类型 将比较函数或对象作为模板参数 set ,然后给它一个 实例 在实际创建集合时比较函数或对象的。


    我会修改我的答案来回答你的后续问题,因为这样比较容易。

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

    但是,catch是,必须指定 具体的 函数,而不是函数指针变量,作为模板参数。例如,这是可以的:

    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<int, 10> array<int, abs(x)> ,例如。数组的大小必须是编译器在编译程序时,但在运行之前可以知道的值。(关于什么是允许的,有一组非常具体的规则—即使编译器看起来应该能够计算出模板参数是什么,比如 LessFunc 上面的例子,它仍然必须遵循特定的规则。对于函数指针模板参数,参数必须是函数名,或者 & 后跟函数名。)