2017-02-13 9 views
0

関数が呼び出されるたびに新しい型を生成できますか? は、私はそれぞれのラムダは、独自のユニークなタイプを持っていることを読んだので、私は試してみた:C++で関数が呼び出されるたびに新しい型を生成する

template<class T, class F> struct Tag { }; 
template<class T> 
auto func(const T &t) -> auto 
{ 
    auto f = []() {}; 
    return Tag<T, decltype(f)>(); 
} 
static_assert(!std::is_same_v<decltype(func(0)), decltype(func(1))>, "type should be different."); 

しかし、static_assertが失敗しました。

func()は、タイプTと値tに関係なくfunc()が呼び出されるたびに異なるタイプの値を返すことができますか?

答えて

2

いいえ、関数が呼び出されたときではありません。型はコンパイル時に生成され、実行時には生成されません。

質問を見るCan the 'type' of a lambda expression be expressed?ここからの回答に基づくコードです。

#include <iostream> 
#include <set> 

int main() 
{ 
    auto n = [](int l, int r) { return l > r; }; 
    auto m = [](int l, int r) { return l > r; }; 
    std::set<int, decltype(n)> s(n); 
    std::set<int, decltype(m)> ss(m); 
    std::set<int, decltype(m)> sss(m); 

    std::cout << (std::is_same<decltype(s), decltype(ss)>::value ? "same" : "different") << '\n'; 
    std::cout << (std::is_same<decltype(ss), decltype(sss)>::value ? "same" : "different") << '\n'; 

} 

結果:

different 
same 
0

C++がある静的型はソースコードだけに存在すること、および実行時に残ってそれらの小さな跡がある言語を、型指定されました。 ラムダも例外ではありません。固有の型はありますが、コンパイル時に定義されています。

実際にテンプレートを使用して新しいタイプを生成することができます。これは、テンプレートがコンパイル時に評価されるため、ソースコード内にのみ存在するためです。
厳密な答えはいいえです。実行時に関数呼び出しが行われるため、関数が呼び出されたときに新しい型を生成することはできません。

これは、いくつかの一般的なデザインパターンをチェックするだけで、巧妙なデザインで、C++で望ましい柔軟性を実現できます。

関連する問題