2016-10-23 36 views
8

Bir tuple tipiniz olduğunu ve başka bir şablonu başlatmak için şablon parametre paketini ayıklamak istediğinizi varsayalım.Değişken şablon şablonu?

template < typename Tuple, template <typename...> typename What > 
struct PutTupleInT; 

template < typename... Types, template <typename...> typename What > 
struct PutTupleInT<std::tuple<Types...>, What> 
{ 
    using Result = What<Types...>; 
}; 

Ama ne arzu şablon değişken şablon ise: bu tip şablon ise, o zaman bir böyle yarar olabilir? Bir tür şablon için template <typename...> typename What "yer tutucu" iken, bir değişken şablonu için "yer tutucu" nedir?

Aşağıdakileri, clang-4.0.0 için (şimdi otomatik türle birlikte olmayan şablon parametrelerini destekleyen tek derleyici) denedim, ancak başarısız oldu. Aslında C++ 17 için doğru bir sözdizimi olup olmadığından emin değilim.

template < typename Tuple, template <typename...> auto What > 
struct PutTupleInV; 

template < typename... Types, template <typename...> auto What > 
struct PutTupleInV<std::tuple<Types...>, What> 
{ 
    static constexpr auto value = What<Types...>; 
}; 
+0

'decltype (vartempl)' işlevini kullanamaz ve değişken şablonun türünü ayıklayamazsınız, aslında ilgilendiğiniz şey nedir? – skypjack

+0

@skypjack Üzgünüm, ne demek istediğini anlamıyorum. – Vahagn

cevap

6

Bunu yapabileceğinizi sanmıyorum. Teklif N4606:

§14.3.3 [temp.arg.template]/1

şablon şablon parametresi için şablon argüman bir sınıf şablonu ismi olacak ya da kimlik tanımlaması olarak ifade edilen bir diğer ad şablonu.

Bir değişken şablonu bu gereksinime uymuyor.


Biraz hile ve şablonu seçmek için bir proxy türü kullanabilirsiniz: Eğer söyleyebiliriz

template<typename...> struct foo{}; 
template<typename... Ts> constexpr foo<Ts...> foo_v{}; 
struct use_foo 
{ 
    template<typename... Ts> 
    static constexpr auto value = foo_v<Ts...>; 
}; 

için daha sonra

template < typename Tuple, class Proxy> 
struct PutTupleInTV; 

template < typename... Types, class Proxy> 
struct PutTupleInTV<std::tuple<Types...>, Proxy> 
{ 
    static constexpr auto value = Proxy::template value<Types...>; 
}; 

ve

PutTupleInTV<tup, use_foo>::value 

live demo

+0

Hile aslında "değer" olarak adlandırılacak ve bir yapıya yerleştirilecek değişkenler gerektirdiğinden, pek yardımcı olmaz. – Vahagn

+0

@Vahagn evet, proxy yapılarını kendiniz yapmak zorundasınız. Bunun etrafında bir yol görmüyorum (hiçbiri bilmiyorum, hiçbirini bilmiyorum) – krzaq

0

PutTupleInTV, PutTupleInV ile aynı adı değil. PutTupleInV şablonunu değil, PutTupleInTV adında yeni bir şey yaratmak için özel sözdizimi kullanmıyorsunuz.

+0

Bu bir yazım hatası, işaretlediğiniz için teşekkürler. – Vahagn

İlgili konular