【问题标题】:Namespace constraint in template definition模板定义中的命名空间约束
【发布时间】:2017-06-28 17:21:16
【问题描述】:

我必须为给定命名空间rofl 中的所有类型专门化一个模板函数。模板类型的命名空间约束是否可能?我有以下想法:

template<typename rofl::T>
MyClass::MyFunc() {
    impl = T::create();
}

【问题讨论】:

  • " 对于所有实例" - 对于什么的所有实例?模板专门针对类型,而不是实例。
  • 没错。经过一天的编程,可能会发生这样的错误。
  • 你认为你为什么要这样做?
  • AFAIK 命名空间对类型没有影响,这使得这不可能。听起来有点像 XY 问题。你需要达到什么目标?
  • 模板的部分荣耀在于它们会根据您的需要进行专业化。您是否要创建一个包含预先专用模板池的文件以减小可执行文件或库的大小?

标签: c++ templates namespaces template-specialization


【解决方案1】:

如果你将函数模板放在你想要专门化的命名空间中,你可以使用参数依赖查找。

struct Out{};

namespace ns
{
    struct In{};

    template <typename T>
    void ADL(const T&){} //Found via argument dependent lookup
}

template <class T, class U = decltype(ADL(std::declval<T>()))>
void func_impl(int) //Better match, only works if function ADL is found
{
    std::cout << "Specialized.\n";
}

template <class T>
void func_impl(...)
{
    std::cout << "Unspecialized.\n";
}

template <class T>
void func()
{
    func_impl<T>(0);
}

当您调用func 时,它将调用func_impl 的正确重载。

func<Out>(); //prints Unspecialized.
func<ns::In>(); //prints Specialized.

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多