首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件模板

问条件模板
EN

Stack Overflow用户
提问于 2020-01-25 01:07:04
回答 3查看 347关注 0票数 1

我有一个带有模板的类,在这个类里面有一个变量T*变量;和变量字符串str;还有一个包含部分代码的函数:

代码语言:javascript
复制
if(std::is_same<T, string>::value){
    *Variable = str;
    return 0;
}

当然,尽管上面的赋值不能在不同的变量上工作,但由于之前的条件,编译器会在编译时抱怨。我在考虑用两个模板参数编写条件模板函数来代替上面的赋值:

代码语言:javascript
复制
Assign(Variable, &str);

在上课前:

代码语言:javascript
复制
template <typename T, typename U>
conditional <T, U> void Assign(T* to, U* from){
    ;
}
conditional <string, string> void Assign(T* to, U* from){
    *to = *from;
}

因此,编译器会为我需要的字符串选择专用的字符串。这是如何表述的?这是否仅适用于变量类型,或者我是否需要第三个参数?或者可能会有某种模板条件,仅用于函数内部的主代码?

EN

回答 3

Stack Overflow用户

发布于 2020-01-25 01:31:30

只需使用模板专门化:

代码语言:javascript
复制
template<typename T>
class Foo {
    T * Variable;

public:
    explicit Foo(T *p) : Variable{p}
    {}

    void Assign(const std::string& str) {
        std::cout << str << " No op\n";
    }
};

template<>
void Foo<std::string>::Assign(const std::string& str) {
    *Variable = str;
}

https://wandbox.org/permlink/Oi1bl8LCQQQ2LyJC

这将适用于相当旧的C++版本(至少是C++03)。

票数 2
EN

Stack Overflow用户

发布于 2020-01-25 02:08:32

如果您可以访问C++17,那么只需使用if constexpr

代码语言:javascript
复制
if constexpr (std::is_same<T, string>::value) {
    *Variable = str;
    return 0;
}
票数 2
EN

Stack Overflow用户

发布于 2020-01-25 03:20:50

因此,我在使用模板和模板专门化的类之前编写了赋值函数

代码语言:javascript
复制
template<typename T, typename U>
void Assign(T* to, U* from){
    ;
}
template<>
void Assign(string* to, string* from){
    *to = *from;
}

我将*Variable = str;行改为:

代码语言:javascript
复制
Assign(Variable, &str);

这是一个对我有帮助的主题:Templated Functions.. ERROR: template-id does not match any template declaration

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59900908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档