2016-12-03 2 views
0

まれTに応じてnormal_distributionはint型にすることができ、それがでハングします:これは私の関数の次の行に使用され、私はしたくないタイプ::テンプレート

std::normal_distribution<T> distribution(0.0, 0.1); 

if/elseに依存するすべてのコード行があります。その結果、私はこれを行うにしようとしています:

#include <random> 

#define T int 

int main() 
{ 
    std::normal_distribution<((std::is_same<T, int>::value) ? (float) : (T))> distribution (0.0, 1$ 

    return 0; 
} 

を、私はこれらのエラーを取得しています:

Georgioss-MacBook-Pro:Code gsamaras$ g++ -std=c++0x main.cpp 
main.cpp:7:69: error: expected expression 
    std::normal_distribution<((std::is_same<T, int>::value) ? (float) : (T))> distribution ... 
                    ^
main.cpp:7:74: error: expected expression 
    std::normal_distribution<((std::is_same<T, int>::value) ? (float) : (T))> distribution ... 
                     ^
main.cpp:7:77: error: C++ requires a type specifier for all declarations 
    std::normal_distribution<((std::is_same<T, int>::value) ? (float) : (T))> distribution ... 
                      ^
3 errors generated. 

このまたは別の問題を解決する方法上の任意のアイデアを?

+1

'のstdを与える::条件'。 –

+0

ああ、それはトリック@ T.C。、ありがとう!私の質問を削除する必要がありますか? – gsamaras

答えて

1
#include <random> 
#include <type_traits> 

template<class T> 
struct X 
{ 
    using float_t = typename 
     std::conditional<std::is_floating_point<T>::value, T, double>::type; 
    std::normal_distribution<float_t> dist{0.0, 0.1}; 
}; 

int main() { 
    X<int> x; 
    X<float> y; 
    return 0; 
} 
+0

私はあなたの答えを私のものよりも好きです!しかし、私はそれを 'X'と名付けるつもりはありません。他の何か.Thanks Pixelχημικέ! – gsamaras

+0

@gsamaras:実際に使用しているテンプレートのプレースホルダ名を意味します。 – Pixelchemist

0

std::conditionalはここソリューションです:

#include <random> 

#define T int 

int main() 
{ 
    std::normal_distribution<typename std::conditional<std::is_same<T, int>::value, float, T>::type> dist(0.0, 1.0); 
    return 0; 
} 

Tがintである場合には、分布のタイプとしてfloatを与えることを言っている、それ以外の場合はT.