c++ - 类型特征和特定行为

标签 c++ templates metaprogramming typetraits

考虑以下模板:

template<class T>
void doStuff(const T& a)
    {
    if(std::is_copy_assignable<T>::value)
        {
        T x;
        x=a;
        printf("Hello\n");
        }
    else
        {
        printf("Goodbye\n");
        }
    }

即使“Hello”部分永远不会为不可复制赋值的类型运行,这也无法编译。我应该怎么做?

最佳答案

这是解决您问题的基于标签分派(dispatch)的方法:

template<class T>
void doStuffHelper(const T& a, std::true_type can_copy_assign)
{
  T x;
  x=a;
  printf("Hello\n");
}
template<class T>
void doStuffHelper(const T& a, std::false_type can_copy_assign)
{
  printf("Goodbye\n");
}
template<class T>
void doStuff(const T& a)
{
  return doStuffHelper( a, std::is_copy_assignable<T>() );
}

这里,只编译有效的版本。 can_copy_assign的名字仅用于文档 - 重点是我基于 std::is_copy_assignable<T>() 进行覆盖,然后我使用覆盖分派(dispatch)来选择我要使用的实现。

在您的代码中,if block 变成类似 if(true) 的东西. else if 的条款 block 即 if(true) 仍然需要编译,这意味着使用的方法必须有效,即使它们永远不会运行。

标签分派(dispatch)解决方案对其进行安排,以便使用使用这些属性的代码编译具有预期属性的函数。

可以使用涉及 SFINAE 的类似方法,但 SFINAE 有一些恼人的并发症,这意味着通常最好尽可能避免使用它。

关于c++ - 类型特征和特定行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134037/

相关文章:

c++ - 我怎样才能让它重复而不陷入无效输入?

c++ - 来自模板特化的模板

c++ - 未实例化的模板的C++标准要求

ruby-on-rails - 通过与 :method and :method as function arguments in ruby 之间的区别

r - 替换函数工厂 r 中的形式参数

c++ - 排序后在未排序数组中查找元素位置的最佳方法

c++ - 如何获取 LPDISPATCH 指针/接口(interface)并将其传递给 activeX 控件

c++ - 模板方法中的标准容器

c++ - 如何定义和设置指向模板类方法的函数指针

c++ - 取消引用时调用成员函数的迭代器适配器