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

How can i use template in valid way in this case?

本文关键字:方式使 有效 这种情况下      更新时间:2023-10-16

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

错误消息:

(1(无效的模板参数
(2(无效的模板参数
(3(在"模板类MyClass"

的模板参数列表中的参数3中的不匹配3
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;
}

好吧。所以...您无法使用功能来做到这一点。在C 功能中,功能不是一流的对象。您可以作为模板参数传递的只是建筑类型和类。但是,您可以通过两种方式模拟传递函数:

2(通过A 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);
}

electType 是一个指定符

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

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