首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,如何有效地使用模板?

在这种情况下,如何有效地使用模板?
EN

Stack Overflow用户
提问于 2017-05-05 13:21:19
回答 1查看 59关注 0票数 0

我不明白在下一个代码中出现这个问题的原因是什么,有什么不对?

错误消息:

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

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 13:50:42

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

1)传递一个名为函子的对象(即带有重载()运算符的对象)。

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

以下是展示的两种方法:

代码语言:javascript
复制
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);

}

解密类型是一个说明符,

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43806084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档