C ++模板类型检查std :: is_same不起作用?

时间:2018-10-18 17:25:30

标签: c++ templates visual-c++

提供以下代码:

#include <string>

template<typename T>
static void parse(T & result)
{
    if (std::is_same<T, struct Foo>::value)
    {
        result.fooValue = 123;
    }
    else if (std::is_same<T, struct Bar>::value)
    {
        result.barValue = 456;
    }
}

struct Foo { int fooValue; };
struct Bar { int barValue; };

int main()
{
    Foo foo;
    parse(foo);

    Bar bar;
    parse(bar);

    return 0;
}

这不会编译并显示错误消息:

error C2039: 'barValue': is not a member of 'Foo'
error C2039: 'fooValue': is not a member of 'Bar'

我在做什么错?有人可以向我解释为什么在将foo传递到parse并传递bar之后为什么会认为它是foo并因此引发编译器错误的原因。这背后的常识是什么?换句话说,检查模板类型的正确原因是什么?

请注意,我已经了解模板专门化和实例化。

谢谢!

1 个答案:

答案 0 :(得分:5)

实例化模板时,两个分支都需要编译。显然,其中之一不能-特定的模板类型只有一个成员,而没有另一个成员。

要解决此问题,您可能需要C ++ 17中的constexpr if,或者在以前的版本中使用标签分发或SFINAE。