2016-05-14 15 views
0

は次のstructください簡素化テンプレートパラメータ

A<12> a; //A<12> should become A<int,12> 

をしかし、これは許可されていません。なぜ許可されないのですか? (そして回避策はありますか?)

+0

誰かがここでの関数テンプレートについて同じ質問を37232082/how-to-make-template-parameter私の答えがupvotedまたは受け入れられるまで、私はこれを複写にすることはできません。 –

+0

タイプエイリアスを除いて、方法は考えられません。 'テンプレート A_t = A ;を使用しています。これは別のタイプを導入することに注意してください。あなたが望むものでなければ、最初のクラスはおそらくひどく設計されているでしょう。 – DeiDei

+0

メモリが使えば、C++ 17に投票されたものの1つは 'template 'でした。それはオウルの投票のためです(6月末)。 – chris

答えて

1

あなたは何を望みますか?

#include <iostream> 

template <typename T, T value> 
struct A { 
    void foo() const { std::cout << "A<int, " << value << ">::foo called\n"; } 
}; 

// Sample partial specialization that you might want. 
template <std::size_t value> 
struct A<std::size_t, value> { 
    void foo() const { std::cout << "A<std::size_t, " << value << ">::foo called\n"; } 
}; 

template <int N> 
using B = A<int, N>; 

template <int N, typename T = int> 
using C = A<T, static_cast<T>(N)>; 

int main() { 
    B<12> a; 
    a.foo(); // A<int, 12>::foo called 
    C<12> c; 
    c.foo(); // A<int, 12>::foo called 
    C<12, std::size_t> d; 
    d.foo(); // A<std::size_t, 12>::foo called 
} 
+0

私はそれが何よりも優れていると思っています....しかし、涼しいものではない – DarthRubik

+0

@DarthRubik私は少し答えを広げました。おそらく 'C'は' B'よりあなたが望むものに近いでしょうか?しかし、 'A <12>'はその宣言が型を最初にリストさせるため、不正な構文です。 – prestokeys

+0

私は知っている....私はちょうどクールなトリックを望んでいた – DarthRubik

0

たぶん、あなたが取得するつもりだ最も近いがメタ工場を使用することです:http://stackoverflow.com/questions/:

template<class T, T value> 
struct A 
{}; 


template<class T = int> 
struct factory 
{ 
    template<T V> using A = ::A<T, V>; 
}; 

int main() 
{ 
    auto x = factory<>::A<12> {}; 
    auto y = factory<short>::A<45> {}; 
}