【问题标题】:Check for the type of a template parameter and use another template检查模板参数的类型并使用另一个模板
【发布时间】:2021-01-15 00:50:04
【问题描述】:

我有一个class C 的模板函数,还有两个typename T 的模板函数,我想使用如下所示:

template <typename T>
std::string MyHelperFunction1(...) { ... }

template <typename T>
std::string MyHelperFunction2(...) { ... }

template <class C>
std::string MyFunction(...) {
    // if C is an instance of Struct1<T> -> call MyHelperFunction1<Struct1<T>>
    // if C is an instance of Struct2<T> -> call MyHelperFunction2<Struct2<T>>
    
    Database db = OpenDatabase();
    return MyFunction<C>(db, ...);  // The same function but with different input args.
}

我发现的最接近的问题是这个 (How to check for the type of template parameter?),它不适用于我的情况,因为我在 MyFunction() 中调用了其他模板函数。什么是我想要的有效解决方案?

【问题讨论】:

  • 我会避免使用具有特殊含义的...(C-省略号或可变参数模板)。
  • 谢谢你,贾罗德。尽管在这种情况下,我认为它不能以任何其他方式阅读,但我同意它具有实际含义并且可能会造成混淆。我会在以后的帖子中记住这一点。 (我现在不改变问题的原因是答案遵循相同的风格。改变问题可能会造成更多的混乱,而不是减少它们)

标签: c++ templates


【解决方案1】:

您可以尝试使用模板特化来决定调用哪个函数,例如:

template <typename T>
struct helper {
    static std::string MyHelperFunction(...) {
        return "";
    }
};

template <typename T>
struct helper<Struct1<T>> {
    static std::string MyHelperFunction(...) {
        return MyHelperFunction1<Struct1<T>>(...);
    }
};

template <typename T>
struct helper<Struct2<T>> {
    static std::string MyHelperFunction(...) {
        return MyHelperFunction2<Struct2<T>>(...);
    }
};

template <class C>
std::string MyFunction(...) {
    helper<C>::MyHelperFunction(...);
    ...
}

【讨论】:

  • 正如@Jarod42 所说。我进行了紫外线处理,然后我意识到这无法编译。
  • @Jarod42 好点。我更新了我的例子
【解决方案2】:

这个想法是写一个助手来根据C的类型调用适当的函数。

template <typename T>
auto MyFunctionHelper(Struct1<T> s, ...) { return MyHelperFunction1(s, ...); }

template <typename T>
auto MyFunctionHelper(Struct2<T> s, ...) { return MyHelperFunction2(s, ...); }

template <typename C>
std::string MyFunction(C c, ...){ return MyFunctionHelper<C>(c, ...); }

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多