我想以某種方式爲一個類創建構造函數,以便編譯器在需要時輕鬆地創建它的新實例。SFINAE重複的構造函數聲明
下面是一個例子。
class C {
public:
C(int) {}; // int constructor
};
如果我再聲明函數:
void F(C _c) {};
我可以稱之爲一個與int和對C編譯器處理的建設:
F(0); // works
我想要什麼要做的是實現同樣的事情,但以lambda爲參數,舉幾個例子:
F([]() {}); //A
F([](int) {}); //B
F([](int)->int { return 0; }); //C
隨着SFINAE並從我從另一個問題獲悉:Auto-constructor not working with <functional> objects
我設法理清一種方法來創建,只有特定的λ簽名匹配構造函數,它會制定出這樣的:
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,但還沒有設法解決這個問題。任何幫助是極大的讚賞。
使用:蘋果LLVM 6.0版(鐺 - 600.0.57)(基於LLVM 3.5svn)
http://stackoverflow.com/questions/15427667/sfinae-working-in-return-type-但不是作爲模板參數 –