c++ - 如何处理模板中的成员变量

标签 c++ templates boost compiler-errors typetraits

我正在使用 boost fusion 库来读取结构中的所有成员。 IdentityNamespace::SomeClass 的成员。通过一些递归操作,v最终会成为一个Namespace::SomeClass对象。输入 if 语句后,我希望能够处理 SomeClass 的成员对象。

template<typename T>
void Function(T const& v)
{
    typedef boost::mpl::range_c<unsigned, 0, boost::fusion::result_of::size<T>::value > T_members;
    boost::fusion::for_each(T_members(), FunctionStruct<T>(v));

    if (std::is_same<T, Namespace::SomeClass>::value)
    {
        v.Identity= "0";
    }
}

当我编译这段代码时,它给我一个 C2039 错误

'Identity': is not a member of 'Namespace::OtherClass'.

因为当 v 是 SubClass 时我只处理成员 identityIdentity 不必是 的成员>其他类。我应该如何编写我的代码才不会出现此编译错误?

谢谢!

最佳答案

不考虑支票

if (std::is_same<T, Namespace::SomeClass>::value)

是一个编译时常量,编译器还是要编译所有函数中的代码。如果 Identity 只是 T 的成员,如果该检查为真,那么如果该检查失败,它显然无法编译。您必须将其移动到不同的功能中。最简单的方法是标签分派(dispatch):

zero_out(v, std::is_same<T, Namespace::SomeClass>{});

与:

template <class T>
void zero_out(T const& v, std::true_type) {
    v.Identity = 0;
}

template <class T>
void zero_out(T const& v, std::false_type) {
    // nothing ?
}

或者在这种情况下,由于我们正在检查特定类型,甚至不需要标签分派(dispatch),可以只提供非模板重载:

zero_out(v);

template <class T>
void zero_out(T const& ) { }

void zero_out(Namespace::SomeClass const& v) {
    v.Identity = 0;
}

旁注,您要在 const 引用上分配成员?

关于c++ - 如何处理模板中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35300242/

相关文章:

c++ - 为什么模板类的显式方法特化可以在类内部没有其原型(prototype)声明的情况下工作

c++ - 在一行中定义多个变量,这是否为构建过程提供了任何优化?

c++ - 为单选按钮创建组

php - 遍历传递给 Twig 模板的所有参数

c++ - C++ 模板中的非法间接寻址

c++ - boost::spirit::qi 文法使用不同迭代器类型的文法

c++ - 我如何知道 Boost 的哪些部分已被弃用?

c++ - 观察无锁队列的大小

c++ - 未读取空格

c++ - 如何将提取的数据写入输出文件。程序旨在从 C++ 文件中提取电子邮件地址