私は後で呼び出すことができる関数のラッパーとして動作ラムダ生成する機能を持っている:テンプレート引数がnoexcept関数であるかどうかをどのように検出できますか?
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)...);
};
}
私は、引数f
がnoexcept
ですので、私の関数の戻り値は、希望したときに返さラムダnoexcept
をしたいのですが次のようになります。
return [&]() noexcept(is_noexcept<decltype(f)>::value)
-> std::result_of_t<F(FArgs...)>
{
return std::forward<F>(f)(std::forward<FArgs>(f_args)...);
};
私の試み:
#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
}
しかし、TE stは常にtrue
を返します。私は何が欠けていますか?誰でもこの問題の解決法を提供できますか?
私が試した最初のことでしたが、 'f()'と 'g()'に 'true'を返します。 – user2296177
私の答えに記載されているように、これはC++で有効な答えです17。 – user2296177