1
我可以typedef
一個std::bind
表達式的返回類型,但顯然編譯器並不滿意我調用此類型的默認構造函數。相反,我必須首先通過與std::bind
完全相同的論點(參見下文)。爲什麼?我做錯了嗎?std :: bind返回的類型是默認構造的嗎?
#include <iostream>
#include <functional>
#define x_plus_one(T) std::bind<T>(f_plus<T>(), std::placeholders::_1, T(1))
template <class T>
struct f_plus
{
inline T operator() (const T& a, const T& b) const
{ return a + b; }
};
template <class T>
using x_plus_one_type = decltype(x_plus_one(T));
int main()
{
auto f = x_plus_one(double);
std::cout<< f(3.2) << "\n";
// auto g = x_plus_one_type<double>(); ==> fails, no matching constructor
auto g = x_plus_one_type<double>(f_plus<double>(), std::placeholders::_1, 1); // but this works?!
std::cout<< g(3.2) << "\n";
}
我也試過路過一個f_minus
函數對象,並交換佔位符和1
,但是編譯器不喜歡它,這真讓我困惑。唯一有效的工作是取代1
,其中2
,它告訴我,無論bind
返回的類型是什麼,它都不復制輸入。爲什麼不?有沒有辦法強制複製?
嗯,這並不理想,但我想這是正確的答案,謝謝。 – Sheljohn 2015-02-08 13:45:19