【问题标题】:Type of std::normal_distribution depending on templatestd::normal_distribution 的类型取决于模板
【发布时间】:2017-04-18 12:45:21
【问题描述】:

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.
  • 啊,这应该可以解决问题@T.C.,谢谢!我应该删除我的问题吗?

标签: c++ c++11 templates stl ternary-operator


【解决方案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;
}

【讨论】:

  • 嗯,比起我的,我更喜欢你的回答!但是,我不会将其命名为 X,也许是别的东西..谢谢 Pixel χημικέ!
  • @gsamaras:它是您实际使用的任何模板的占位符名称。
【解决方案2】:

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。

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2022-01-09
    • 2012-07-02
    • 2018-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多