我正在尝试做这样的事情:
#define SOME_PAIR(x, y) std::make_pair<bool, std::string>(x, y)
所以程序员必须写的只是:
return SOME_PAIR(true, "Amazing");
但看起来我做错了,因为'没有函数模板的实例“std :: make_pair”匹配参数列表'。
我能做些什么(或类似的东西)?
编译器: VC110 IDE: VS2012 操作系统: Win7x64
编辑:以下代码(感谢 jxh )使其完美运行:
#define SOME_PAIR(x, y) std::make_pair(bool(x), std::string(y))
因此我的lamda函数最终变得非常整洁:
boot.init("log", [&](){
return INIT_PAIR(log.loaded, "Could not open log config file");
});
答案 0 :(得分:2)
您可以“强制转换”参数并允许类型推导来实例化正确的模板函数:
#define SOME_PAIR(x, y) std::make_pair(bool(x), std::string(y))
答案 1 :(得分:0)
以下对我有用。
g ++ -std = c + 0x -Wall -Wextra pair.cpp
#include <iostream>
#include <string>
#include <utility>
#define PAIR(x, y) std::make_pair<bool, std::string>(x, y)
int main(int, char* []) {
auto p = PAIR(true, "abc");
std::cout << p.first << " " << p.second << std::endl;
return 0;
}
答案 2 :(得分:0)
你忘记了
#include <utility>
在调用宏的文件中?编译在宏扩展时失败。
答案 3 :(得分:0)
为什么不使用模板?它适用于大多数类型(不仅仅是bool和string)。类似的东西:
#include <iostream>
template<class T1, class T2>
inline std::pair<T1, T2> SOME_PAIR(T1 t1, T2 t2) {
return std::make_pair(t1, t2);
}
int main() {
std::pair<bool, std::string> p = SOME_PAIR(true,"hello");
return 0;
}