首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sfinae在clase模板中选择不同的方法实现

使用sfinae在clase模板中选择不同的方法实现
EN

Stack Overflow用户
提问于 2013-09-09 14:03:28
回答 4查看 1.2K关注 0票数 1

对于GTK GUI,我有一个简单的包装类,如下所示:

代码语言:javascript
运行
复制
template <class T>
class LabeledEntry
{
    string name;
    T var;

    Gtk::HBox hbox;
    Gtk::Label label;
    Gtk::Entry entry;

    public:
    LabeledEntry( string _name, T _var, Gtk::VBox* vbox):
        name( _name ),
        var(_var)
    {
        label.set_text( name.c_str() );
        ostringstream os;
        os << var ;

        entry.set_text( os.str().c_str() );
        hbox.add( label );
        hbox.add( entry );

        vbox->add( hbox);
    }

    T Get()
    {
        string valString( entry.get_text());
        istringstream is( valString);
        is >> noskipws >> var;

        return var;
    }
};

现在,如果T Get()的类型是string,我需要一个特殊的实现,因为跳过字符串的空白是行不通的。在这里,我需要方法中的getline

我发现了很多std::is__xxx模板来检查很多属性,比如is_integral等等。但是我需要直接和给定的类型进行比较。有机会吗?

以及如何在类中编写这两个实现的语法?类似于:

代码语言:javascript
运行
复制
class ...
{ 
    std::enable_if( true, XXX_IS_STRING)::type Get()
    {
    }

    std::enable_if ( false, XXX_IS_SRING)::type Get()
    {
    }
};

对不起,我有点困惑使用SFINAE在成员参数列表中没有模板参数。

EN

Stack Overflow用户

发布于 2013-09-09 14:31:33

这样做的一种方法是在类之外使用一个函子,将工作委托给它。下面是一个简单的示例,它没有做任何有用的事情,但是您应该了解情况:

代码语言:javascript
运行
复制
template <typename U>
struct get_functor
{
    std::string operator()(U const & val) const
    {
        std::stringstream ss;
        ss << val;
        return ss.str();
    }
};

template <>
struct get_functor<std::string>
{
    std::string operator()(std::string const &) const
    {
        return "something else";
    }
};

template <typename T>
struct demo
{
    explicit demo(T val) : val_(val) {}

    decltype(get_functor<T>()(std::declval<T>())) get() const
    {
        return get_functor<T>()(val_);
    }

    private:
        T const val_;
};

或者您可以使用enable_if,但是在那里您必须创建一个虚拟模板typename U = T来启用SFINAE:

代码语言:javascript
运行
复制
enum class enable_if_helper {};

template <bool C> 
using enable_if = typename std::enable_if<C, enable_if_helper>::type;

template <bool C>
using disable_if = typename std::enable_if<!C, enable_if_helper>::type;

template <typename T>
struct demo
{
    explicit demo(T val) : val_(val) {}

    template <
        typename U = T, 
        enable_if<std::is_same<U, std::string>::value>...
    >
    std::string get() const
    {
        return "something else"; 
    }

    template <
        typename U = T,
        disable_if<std::is_same<U, std::string>::value>...
    >
    std::string get() const
    {
        std::stringstream ss;
        ss << val_;
        return ss.str();
    }

    private:
        T const val_;
};
票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18700072

复制
相关文章

相似问题

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