2011-02-03 21 views
16

, bir iyi biçimli programda tip void bir örneğini olamaz, bu nedenle aşağıdaki beyanı gibi bir şey derlemek olmaz:Void tip :: Açıkçası tanımlama grubu

std::tuple<void, double, int> tup; 

Ancak, Nesnelere karşı olan türlerle kesinlikle uğraştığımız sürece, sorun yok gibi görünüyor. Örneğin, benim derleyici (GCC) sağlar dememi:

typedef std::tuple<void, double, int> tuple_type; 

o C++ 0x ile biz sadece meta-programlama bir sürü numara gerçekleştirmek için std::tuple kullanabilirsiniz görünüyor, çünkü bu, bana ilginç olduğunu Daha önce boost::mpl kitaplık gerekli olurdu. Örneğin, bir vektör türünü oluşturmak için std::tuple'u kullanabiliriz. Biz demek sadece olabilir

:

Örneğin

, bir fonksiyon imza temsil türlerinin bir vektör oluşturmak istediğinizi varsayalım

template <class R, class... Args> 
struct get_function_signature; 

template <class R, class... Args> 
struct get_function_signature<R(*)(Args...)> 
{ 
    typedef std::tuple<R, Args...> type; 
}; 

Bu fonksiyon imzası void olsa bile, iş gibi görünüyor Hiçbir zaman aslında get_function_signature<F>::type örneğini gerçeklestirmediğimiz sürece yazın.

Ancak, C++ 0x benim için hala yeni ve elbette tüm uygulamalar hala biraz deneysel, bu yüzden bu konuda biraz huzursuzum. std::tuple'u gerçekten meta programlama için bir vektör olarak kullanabilir miyiz?

+1

"boost :: mpl :: vector" ifadesinin kullanımdan kaldırılmasını bekliyorum. Her neyse, 'trpl :: mpl' işlevselliği ve şablon meta programlamasının çoğu, değişken şablonlar için destek artacağında önemli ölçüde değişecektir. –

cevap

10

Aslında sürece sadece üzerinde tuple_element kullanmak için bir tip liste olarak kullandıkça

typedef std::tuple<void, double, int > tuple_type;

yapabilirsiniz mantıklı geliyor. Böylece biz onu örneğini sürece void*

+0

Bazı standart kütüphane uygulamalarının, bunu yayınlamaksızın destekleyen diğer standart kütüphane uygulamalarından sonra bile bunu başaramayacağı anlaşılıyor. Örneğin, Clang MSVC'nin standart kütüphanesini kullanmıyorsa GCC ve Clang onu reddeder ve MSVC bunu kabul eder. –

0

Muhtemelen, tuple ile void eleman güvenli olduğu gibi param ilan edecek

tuple_element<0,tuple_type>::type * param;

yapabilirsiniz. Biz

struct C : std::tuple<void> {... 

aşağıdakilerden olarak yazamıyor bile bu kullanım şimdi yararlı olduğunu
Yani, davayı düşünemiyorum. Yani, önemli değil.

Bu, std::pair için de geçerlidir. Biz aşağıdaki gibi basit tür listesi yazabilirsiniz: nasılsa böyle pair kullanım nadir olarak görünüyor

struct Nil; 
typedef std::pair< void, std::pair< int, Nil > > t; 

bile.

Bazı SFINAE benzeri amaçlarla, tuple liste listesi, bazı durumlarda başarısız olabilir. Örneğin, aşağıdaki kod ideone'da derlenmemiştir (gcc-4.5.1) ben test zaman:

std::tuple<void> f(); 
template< class T > char g(T const&); 

int main() { 
    sizeof g(f()); 
} 

Yani, şimdiki tip listeleri yakın gelecekte tuple tamamen değiştirilebilir emin değilim.