F
DrakoXP schrieb:
Du wirst dir das wahrscheinlich denken können, aber als Workaround kann man,
sofern der Typ aller Wert-Template-Parameter gleich ist, diesen auch als T... (z.B. int...) schreiben.
Nein, wusste ich nicht. Ich habe keine Ahnung von C++11. Aber danke für's Aufklären.
Ein weiterer (umständlicher und hässlicher) Workaround für C++11 wäre sowas hier: http://ideone.com/KNzR3d
#include <type_traits>
#include <array>
#include <iostream>
template<bool Condition, template<typename...> class T, template<typename...> class U>
struct Conditional
{
template<typename... Args>
using Type = T<Args...>;
};
template<template<typename...> class T, template<typename...> class U>
struct Conditional<false, T, U>
{
template<typename... Args>
using Type = U<Args...>;
};
template<typename T, typename Size>
using Array = std::array<T, Size::value>;
template<typename T, typename Size>
using BigArray = std::array<T, Size::value * 2>;
int main()
{
Conditional<true, Array, BigArray>::Type<int, std::integral_constant<std::size_t, 42>> Foo;
std::cout << Foo.size() << '\n';
Conditional<false, Array, BigArray>::Type<int, std::integral_constant<std::size_t, 42>> Bar;
std::cout << Bar.size() << '\n';
}
Zunächst wollte ich die integral_constant s automatisch Entpacken mit IsIntegralConstant und einer wilden SFINAE-Konstruktion, aber man muss ja leider explizit typename angeben, was man durch kein Mittel in eine Kondition packen kann.