假設我有一個包含成員變量f
的函數my_struct
。 f
可能是一個C++ 11 lambda函數。如何在編譯時檢測某個類型是否是lambda表達式?
由於分配給lambda對象是非法的,我想實現my_struct
的賦值運算符,這樣當f
是lambda時,它不被賦值。
是否有可能建立一個類型性狀is_lambda
它可以檢查類型爲lambda-ness?
在代碼:
#include <type_traits>
template<typename Function> struct is_lambda
{
// what goes here?
};
template<typename Function> struct my_struct
{
Function f;
my_struct &do_assign(const my_struct &other, std::true_type)
{
// don't assign to f
return *this;
}
my_struct &do_assign(const my_struct &other, std::false_type)
{
// do assign to f
f = other.f;
return *this;
}
my_struct &operator=(const my_struct &other)
{
return do_assign(other, typename is_lambda<Function>::type());
}
};
這似乎在Visual C++ 2015中工作,也許在早期版本中也是如此。簡單地使用:'std :: is_assignable :: value'。我使用這種方法確保lambda不是從使用_EBO_時派生而來的。 –
@MatthewHolder雖然這種想法讓我想起了答案,但你不應該試圖給予lambdas特殊待遇。從lambda衍生出來沒有任何內在的錯誤。它有一些方面可能會使其變得棘手,但這些相同的方面可以適用於非lambda類。他們不可轉讓的事實不是其中之一,所以就你的情況而言,我認爲這不是應該檢查的方面。 – hvd
可以理解,但是需要我檢測lambda的情況是將FunctionObject傳遞給將用作空基優化的類模板的基類的類模板類型參數。由於在某些情況下或某些編譯器中不能繼承lambda類型。隨着這種情況的改善......這將不再是一個問題。 –