【发布时间】:2015-07-02 01:16:42
【问题描述】:
我想为一个类创建构造函数,以便编译器在需要时轻松创建它的新实例。
这是一个例子。
class C {
public:
C(int) {}; // int constructor
};
如果我再声明一个函数:
void F(C _c) {};
我可以用 int 调用它,并让编译器处理 C 的构造:
F(0); // works
我想做的是实现同样的事情,但是用lambdas作为参数,举几个例子:
F([]() {}); //A
F([](int) {}); //B
F([](int)->int { return 0; }); //C
通过 SFINAE 以及我从另一个问题中学到的知识:Auto-constructor not working with <functional> objects
我设法找到了一种方法来创建一个只匹配特定 lambda 签名的构造函数,它的工作原理如下:
template<typename F, typename = decltype(function<void(void)>(declval<F&>()))> C(F&& f) {}; //For lambda's like A
template<typename F, typename = decltype(function<void(int)>(declval<F&>()))> C(F&& f) {}; //For lamdba's like B
template<typename F, typename = decltype(function<int(int)>(declval<F&>()))> C(F&& f) {}; //For lambda's like C
现在我遇到的问题是,如果我一次添加这三个定义,我会收到一条错误消息,指出我正在尝试重新定义 C 的构造函数。这是正确的,因为,是的,构造函数被定义为 C (F&& f) 三次,但是,我应该如何让编译器知道对每种不同的情况使用不同的签名?
另一个答案提示我查看 enable_if 和 is_convertible 但尚未设法为此问题设置解决方法。非常感谢任何帮助。
使用:Apple LLVM 6.0 版 (clang-600.0.57)(基于 LLVM 3.5svn)
【问题讨论】:
标签: c++ constructor sfinae