2014-09-18 27 views
5

Bir liste türünü, listenin olması gereken argüman türünü geçmek zorunda kalmamanın bir yolu var mı, sadece ilk eleman türünden çıkar.Variadic Şablon için Deduce Bağımsız Değişken Türü?

template<typename T, T... Args> 
struct Calc 
{ 
    // do stuff with Args 
}; 

// Usage: 
Calc<int, 1, 2, 3>::value; 

typename<T... Args> Calc { }; // error T undefined 

// Desired: 
Calc<1, 2, 3>::value;   // auto deduced T = int 
Calc<1.0f, 2.0f, 3.0f>::value; // auto deduced T = float 

İstenen davranışı elde etmenin bir yolu var mı yoksa türü bir parametre olarak eklemek zorunda mıyım?

+0

Tanıtımı dynamic_cast <> kullanmayı deneyebilirsiniz. Bu, olası türlerin ne olduğunu biliyorsanız. – RockOnRockOut

+4

Hayır, daha önce önerilmiş olmasına rağmen, bu tür bir kesinti henüz mümkün değildir: http://open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3601.html – Brian

+1

Std olarak bildirme değeri :: common_type işe yarayabilir? – mattnewport

cevap

0

Bildiğim kadarıyla C++ 14'e kadar mümkün değildir. Bununla birlikte, C++ 17, Kullanıcı tanımlı indirgeme kılavuzları class template argument deduction

+0

Kesinti kılavuzları yardımcı olmayacaktır, ancak ['auto' şablon parametreleri] (http://en.cppreference.com/w/cpp/language/template_parameters#Non-type_template_parameter) (ayrıca C++ 17'de) olacaktır. – Quentin

İlgili konular