/ / matriz de estructuras como parámetro de plantilla - c ++, templates, c ++ 11, typetraits

matriz de estructuras como parámetro de plantilla - c ++, templates, c ++ 11, typetraits

Estoy tratando de pasar un puntero a una serie de structs como un argumento de plantilla. Me las arreglé para hacerlo después de un tiempo:

struct something{};

constexpr const something single;
constexpr const something array[12];
template<const something* arg> void f() {}

template<typename T>
constexpr T* workaround(T* v){
return v;
};

void bind(){
f<&single>();                       //OK
f<array>();                         //NO
f<&array>();                        //NO
f<&array[0]>();                     //NO
f<workaround(array)>();             //NO
f<(const something*)array>();       //OK
}

¿Es este uno de los casos raros en los que una matriz no se puede usar de forma transparente como puntero, o es un error del compilador?

Respuestas

1 para la respuesta № 1

En realidad creo que la forma más simple de la llamada, f<array>();, funciona si solo declara-define array correctamente:

struct Elem
{ };

constexpr const Elem array[5] { {} , {} , {} , {} , {} };

template<const Elem* arg> void f()
{ }

int main()
{
f<array>();
return 0;
}

Lo único que cambié (aparte de reducir la matriz de 12 a 5 elementos) es agregar un inicializador para array.

(Esto se compila para mí, usando GCC 4.7.2.)


1 para la respuesta № 2

Al jugar con esto con Apple clang v4.1, he llegado al siguiente código que compila. Debo admitir que no sé si es correcto que Clang insista en un enlace externo para single y array. También, basado en las modificaciones de jogojapan sin ninguna razón en particular.

struct Elem {};

extern const Elem single;
extern const Elem array[3];

constexpr const Elem single {};
constexpr const Elem array[3] {{},{},{}};

template<const Elem* arg> void f()
{ }

int main()
{
f<&single>();
f<array>();
return 0;
}

FWIW, llegué a esta foto en la oscuridad después de tropezar con esto: http://lists.apple.com/archives/xcode-users/2006/Jun/msg00799.html