在这种情况下,我如何以有效的方式使用模板?

时间:2017-05-05 13:21:19

标签: c++ templates

我不明白我在下一段代码中遇到这个问题的原因是什么,哪些不行?

错误消息:

  

(1)模板参数无效
  (2)模板参数无效
  (3)模板参数列表中参数3的不匹配'模板类MyClass'

template<typename Data, typename KeyType, typename CompareFunction>
class MyClass{
private:
    MyClass* user;
    Data data;
    KeyType key;
    CompareFunction cmpFunction;

public:
    MyClass(KeyType key, Data data, CompareFunction cmpFunction);
...
};  

///////////////////////////////////////////////////////

bool CMP(int a, int b) {
    return a == b;
}

int main{
MyClass<int, int, CMP> *my_class= new MyClass<int, int, CMP>(2, 3); // ALL THE 
                                                                    //  ERRORS
...
...
return 0;
}

1 个答案:

答案 0 :(得分:1)

好。所以...你不能用功能做到这一点。在c ++函数中不是第一类对象。您可以作为模板参数传递的内容仅是内置类型和类。 但是,您可以通过两种方式模拟传递函数:

1)传递一个名为仿函数的对象(即具有重载()运算符的对象)

2)传递 lambda表达式(一种动态函数)

以下是展示的两种方法:

template<typename Data, typename KeyType, typename CompareFunction>
class MyClass {

private:
    MyClass *user;
    Data data;
    KeyType key;
    CompareFunction cmpFunction;

public:
    MyClass(KeyType key, Data data, CompareFunction cmpFunction) :
            key(key), data(data), cmpFunction(cmpFunction) {}
};

///////////////////////////////////////////////////////

// 1) Functor class
class CMP {
    int operator()(int a, int b) {
        return a == b;
    }
};

// 2) Lambda expression
auto lambda_CMP = [](int a, int b) -> bool { return a == b; };

int main() {

    // 1) Using functors:
    MyClass<int, int, CMP> * my_class = new MyClass<int, int, CMP>(2, 2, CMP());

    // 2) Using lambda expression
    MyClass<int, int, decltype(lambda_CMP)> *lambda_class =
            new MyClass<int, int, decltype(lambda_CMP)>(2, 2, lambda_CMP);

}

decltype

的说明符
  

检查实体的声明类型或表达式的类型和值类别。   (http://en.cppreference.com/w/cpp/language/decltype

注意:我必须在构造函数中添加一个初始化列表,因为删除了lambda的默认构造函数,所以你必须在类中以某种方式分配它。