2015-11-08 16 views
7

ben sonradan çağırabileceği bir işleve sarıcı olarak davranan bir lambda oluşturmak için fonksiyonu var:Şablon argümanının noexcept işlevi olup olmadığını nasıl anlarım?

template <typename F, typename... FArgs> 
auto make_lambda(F&& f, FArgs&&... f_args) 
{ 
    return [&]() -> std::result_of_t<F(FArgs...)> 
    { 
     return std::forward<F>(f)(std::forward<FArgs>(f_args)...); 
    }; 
} 

ben yapmak istiyorum döndü lambda noexcept argüman fnoexcept, yani benim işlevin dönüş olur iken şu şekilde görünür:

return [&]() noexcept(is_noexcept<decltype(f)>::value) 
    -> std::result_of_t<F(FArgs...)> 
{ 
    return std::forward<F>(f)(std::forward<FArgs>(f_args)...); 
}; 

girişimim:

#include <type_traits> 

void f() {} 
void g() noexcept {} 

template <typename F, typename... Args> 
struct is_noexcept : std::false_type {}; 

template <typename F, typename... Args> 
struct is_noexcept<F(Args...) noexcept> : std::true_type {}; 

int main() 
{ 
    bool constexpr func_test_a{ is_noexcept<decltype(f)>::value }; // true 
    bool constexpr func_test_b{ is_noexcept<decltype(g)>::value }; // true 
} 

Ancak, te st, her zaman true değerini döndürür. Neyi kaçırıyorum? Bu soruna çözüm önerisi olan var mı?

cevap

9

: http://en.cppreference.com/w/cpp/language/noexcept_spec

noexcept özellikli fonksiyonu tipi bir parçası değildir. ( C++ 17'e kadar).

noexcept belirticinin bir işlev türünün parçası olmadığından, şablon kesintisi doğru sonuçları vermeyecektir; şablon tipi kesinti C++ 17'ye kadar çalışmaz. Bir fonksiyonun noexcept olup olmadığını tespit etme yolum, C++ 17'de this answer'un yolu olarak geçerli olacaktır.

7

Bir ifade alan ve bu ifade noexcept ise true üreten noexcept operator kullanabilirsiniz.

Test edilmedi, ancak bu kullanım durumunuz için işe yarayabilir. Kaynaktan

return [&]() noexcept(noexcept(std::forward<F>(f)(std::forward<FArgs>(f_args)...))) 
    -> std::result_of_t<F(FArgs...)> 
{ 
    return std::forward<F>(f)(std::forward<FArgs>(f_args)...); 
}; 
+0

Denediğim ilk şey buydu, ancak yine de 'f()' ve 'g()' için 'true' döndürüyor. – user2296177

+0

Cevabımda belirtildiği gibi, bu C++ 17'de geçerli bir cevap olacaktır. – user2296177

İlgili konular