2016-08-08 20 views
8

C++ 11 standardı, derleyici zamanındaki bazı boole koşullarına göre tip seçimi için std::conditional<> şablonuna sahiptir. Aynı işlem nasıl yapılır, ancak değişken başlatma için init değerini seçmek için nasıl kullanılır? type a = (exp) ? first_value : second_value; benzer.Koşullu değişken başlatması derleyici zamanında nasıl yapılır?

benim şablonunu kullanmak:

template<bool B, typename T> 
inline constexpr T&& conditional_initialize(T&& i1, T&& i2) { 
    return B ? std::move(i1) : std::move(i2); 
} 

Ama sadece POD türleri için kullanılabilir: int a = conditional_initialize<true>(1, 2);. Dizinin başlatılması için bu şablon hata ile derlenmiştir. Yanlış derleme örneği: int a[] = conditional_initialize<true>({1, 2}, {3,4,5});

Hata mesajı: no matching function for call to 'conditional_initialize(<brace-enclosed initializer list>, <brace-enclosed initializer list>)';

şablonla bana yardımcı olabilir?

+2

Hayır, 'std :: initializer_list ' – alexeykuzmin0

+0

'int bir [] = conditional_initialize ({1, 2}, {3,4,5}) var @AndyG yerleşik diziler oluşturun. –

+2

@ alexeykuzmin0 gerçekten olurdu, ancak ne yazık ki [şablonlar std :: initializer_list' ( Quentin

cevap

8
template<class T, std::size_t N, std::size_t M, bool b> 
std::array<T, b?N:M> 
conditional_array(std::array<T, N>&& lhs, std::array<T, M>&& rhs) { 
    return std::move(std::get<b?0:1>(std::tie(lhs, rhs))); 
} 

bu verir: yakındır

auto a = conditional_array<int,2,3,true>({{1, 2}}, {{3,4,5}}); 

. Genel olarak {} yapıları ifadeler değildir, herhangi bir mekanizma yoluyla başka bir değişken üzerinden mükemmel şekilde iletilemezler.

Biz de alabilirsiniz:

auto a = cond_init<true>(make_array(1,2), make_array(3,4,5)); 

biraz daha çalışma ile.

template<bool Test, class A, class B> 
std::conditional_t<Test,A,B> 
cond_init(A a, B b) { 
    return std::move(std::get<Test?0:1>(std::tie(a,b))); 
} 
template<class T0, class...Ts> 
std::array< std::decay_t<T0>, sizeof...(Ts)+1 > 
make_array(T0&& t0, Ts&&...ts) { 
    return {{std::forward<T0>(t0), std::forward<Ts>(ts)...}}; 
} 

Bunları constexpr, tembel çünkü yapmadı. 'Bu çalışamaz, kopyalama ya da değil hareket etmektedir;

+0

** Yakk **, nasıl bir şablon hakkında - http://cpp.sh/6swua? – 23W

+0

@ 23W bu sadece benim 'cond_init' ve manuel 'make_array' küçük değişikliklerle durumda değil mi? Ben tembeldi ben std :: tie' ve denetimini denetlemedim C++ kullandığınız sürüm için yeterince 'constexpr' vardır. – Yakk

+0

Evet öyle.Basit tipler ve C++ std dizisi (farklı boyutlar için farklı tipler) için tek bir yaklaşım için kodunuzun değiştirilmesidir. – 23W

İlgili konular