我試圖編譯這段代碼,但它在運行C 14時失敗了C 17
#include <cstdio>
#include <utility>
template <typename F>
struct S {
explicit S(F&& fn): fn(std::move(fn)) {}
F fn;
~S() { fn(); }
};
int main(){
S obj([]() noexcept {
std::printf("Foo\n");
});
}
我看到在C 17建構式中S被呼叫為
call S<main::{lambda()#1}>::S(main::{lambda()#1}&&)
這表明編譯器推匯出模板引數。C 14除了執行以下操作之外,是否還有其他方法可以編譯此代碼?
auto fn = []() noexcept {
std::printf("Foo\n");
};
S<decltype(fn)> obj(std::move(fn));
uj5u.com熱心網友回復:
類模板引數推導 ( CTAD ) 僅在 C 17 中引入。您可以使用函式推匯出引數:
template <typename F>
S<F> make_S(F&& fn) { return S<F>{std::forward<F>(fn)}; }
int main(){
auto obj = make_S([]() noexcept {
std::printf("Foo\n");
});
}
uj5u.com熱心網友回復:
如果您可以使用固定的函式簽名,那么這也適用于 C 14。
#include <functional>
#include <iostream>
#include <utility>
struct S
{
template <typename F>
explicit S(F&& fn) :
m_fn(fn)
{
}
~S()
{
m_fn();
}
private:
std::function<void ()> m_fn;
};
int main() {
S obj([]() noexcept
{
std::cout << "Foo\n";
});
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370014.html
下一篇:C 中可變引數模板對的列印方法
