【问题标题】:Function template partial specialization - are there any workaround?函数模板部分专业化 - 有什么解决方法吗?
【发布时间】:2018-07-25 14:32:40
【问题描述】:

我有以下功能

enum class NodeCachingOptions
{
    AddPath,
    DontAddPath
};

template <typename T, NodeCachingOptions>
T* CreateSObject(const MPath& path)

想法是为不同的 NodeCachingOptions 专门化函数。

原来不可能使用部分函数模板专业化,因此我尝试了一种解决方法:

template <typename T, NodeCachingOptions>
T* CreateSObject(const MPath& ob)
{
   CreateSObject_Impl<class T, NodeCachingOptions> temp
   return temp.call(ob);
}

template <typename T, NodeCachingOptions>
struct CreateSObject_Impl
{
    T* call(const MPath& ob);
};

template <typename T>
struct CreateSObject_Impl<typename T, NodeCachingOptions::AddPath>
{
   T* call(const MDagPath& ob)
   {…}
}
template <typename T>
struct CreateSObject_Impl<typename T, NodeCachingOptions::DontAddPath>
{…}

但是我得到编译错误:::NodeCachingOptions': 非类型模板参数'__formal'的非法类型

我做错了什么,有没有更好的方法来解决这个问题?

我从这里了解了 struct impl:Partial template specialization of free functions - best practices

【问题讨论】:

  • 您的代码中有一些很奇怪的地方。当您说“想法是为不同的 NodeCachingOptions 专门化功能”时,您是什么意思?您的意思是 NodeCachingOptions 的不同实现,或者 NodeCachingOptions 的值是 AddPath 还是 DontAddPath?
  • 无论如何,您的第一个模板函数存在语法问题。你不能像这样在模板声明中只给出一个现有的类名。
  • CreateSObject 对于 NodeCachingOptions::AddPath 和 NodeCachingOptions::DontAddPath 应该有不同的实现。我不想编写 2 个不同的函数(例如 CreateSObject_DontSavePath(...) 和 CreateSObject(...) )
  • 这与例如有什么不同?模板 struct mul_impl ... 模板 struct mul_impl ? (我看这里例如:stackoverflow.com/questions/2403928/…)
  • 好的我明白你现在想做什么(感谢下面的答案)。我在想一些完全不同的事情,我的错。

标签: c++ templates


【解决方案1】:

你的语法全错了。实现它

template <typename T, NodeCachingOptions opt>
T* CreateSObject(const MPath& ob)
{
   CreateSObject_Impl<T, opt> temp;
   return temp.call(ob);
}

您将NodeCachingOptions 类型的值 作为CreateSObject_Impl 的第二个模板参数,而不是类型本身。

您可能希望将call 设为CreateSObject_Impl 的静态成员,并编写return CreateSObject_Impl&lt;T, opt&gt;::call(ob);

【讨论】:

  • 请注意,您将作为模板传递给您的方法的NodeCachingOptions 对象必须是常量。否则你必须找到另一种方式。
  • 哦,我明白了。谢谢!
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多