具有多种类型的访客变体(字符串,bool,积分,浮点数)

时间:2018-03-30 17:57:42

标签: c++ templates

我尝试将变体的访问者用于多种类型,然后生成新的随机值。请注意,由于我无法控制的原因,我无法使用比Visual Studio 2015 Update 3和GCC 4.9更新的编译器。

这就是我所拥有的

std::random_device randomDevice;
std::mt19937 randomEngine(randomDevice());

typedef mpark::variant<     // Implementation of std::variant for C++11,14
    bool,
    int8_t, uint8_t,
    int16_t, uint16_t,
    int32_t, uint32_t,
    int64_t, uint64_t,
    float, double,
    std::string
> VariantValue;

struct ValueVisitor
{
    ValueVisitor(VariantValue* pNewVal)
      : pNewVal(pNewVal) {}

    void operator()(const std::string & s) const
    {
      // Generate some random string into *pNewVal
    }

    void operator()(const bool& t) const
    {
        *pNewVal = !t;
    }

    template <typename T,
      std::enable_if_t<std::is_integral<T>::value>* = nullptr,
      std::enable_if_t<!std::is_same<T, bool>::value>* = nullptr>
    >
        void operator()(const T& t) const
    {
        std::uniform_int_distribution<T> dist
        (
            std::numeric_limits<T>::lowest(),
            std::numeric_limits<T>::max()
        );

        *pNewVal = dist(randomEngine);
    }

    template <typename T, typename std::enable_if<
        std::is_floating_point<T>::value>::type* = nullptr>
        void operator()(const T& t) const
    {
        std::uniform_real_distribution<T> dist
        (
            std::numeric_limits<T>::lowest(),
            std::numeric_limits<T>::max()
        );

        *pNewVal = dist(randomEngine);
    }

    VariantValue* pNewVal;
};

VariantValue vSource {(double)12 };
VariantValue vTarget;

ValueVisitor valueVisitor(&vTarget);
mpark::visite(valueVisitor, v);

但我收到错误C2338 invalid template argument for uniform_int_distribution

查看输出窗口以获取更多详细信息

1>c:\program files (x86)\microsoft visual studio 14.0\vc\include\random(2387): error C2338: invalid template argument for uniform_int_distribution
1>  d:\project\xxx.cpp(271): note: see reference to class template instantiation 'std::uniform_int_distribution<T>' being compiled
1>          with
1>          [
1>              T=int8_t
1>          ]
1>  d:\project\3rdparty\mpark\include\mpark\lib.hpp(237): note: see reference to function template instantiation 'void ValueVisitor::operator ()<T,void>(const T &) const' being compiled
1>          with
1>          [
1>              T=int8_t
1>          ]
...

所以,如果我很好理解,那么当T=bool目标函数的目标是is_integral的时候。但为什么 ?我用std::enable_if_t<!std::is_same<T, bool>::value>* = nullptr明确删除了bool类型。

我尝试了不同的方法

template <typename T>
void operator()(const T & t)
{
    if (std::is_same<T, bool>::value) {
    } else if (std::is_floating_point<T>::value) {
    } else if (std::is_integral<T>::value) {
    } else if (std::is_same<T, std::string>::value) {
}

但是没有成功,这是最糟糕的,因为现在浮动变化仍在尝试使用uniform_int_distribution

我真的不在乎。

致以最诚挚的问候,

0 个答案:

没有答案