std::normal_distribution 的类型取决于模板
Type of std::normal_distribution depending on template
很少T
可以是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.
关于如何解决这个问题或替代方案的任何想法?
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。
#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;
}
很少T
可以是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.
关于如何解决这个问题或替代方案的任何想法?
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。
#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;
}