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

标签 c++ templates c++11 sfinae

我有一个像这样的 GTK GUI 的简单包装器类:

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 的类型是 string,现在我需要一个特殊的 T Get() 实现,因为跳过字符串的空格是不工作。所以这里我需要方法中的getline

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

在类中编写这两个实现的语法是怎样的?像这样的东西:

class ...
{ 
    std::enable_if( true, XXX_IS_STRING)::type Get()
    {
    }

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

抱歉,我对在成员参数列表中没有模板参数的 SFINAE 使用感到有点困惑。

最佳答案

您应该使 Get 函数模板化并像这样使用 std::enable_if:

#include <type_traits>
#include <iostream>
#include <string>

template <class T>
class LabeledEntry
{
    // ...
public:
    template <class U = T>
    typename std::enable_if<std::is_same<U, std::string>::value, U>::type
        Get()
    {
        return {"string"};
    }

    template <class U = T>
    typename std::enable_if<!std::is_same<U, std::string>::value, U>::type
        Get()
    {
        return {42};
    }
};

int main()
{
    LabeledEntry<std::string> sle;
    std::cout << sle.Get() << std::endl;

    LabeledEntry<int> ile;
    std::cout << ile.Get() << std::endl;
    return 0;
}

关于c++ - 使用 sfinae 在 clase 模板中选择不同的方法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18700072/

相关文章:

c++ - 从 yml 文件初始化相机参数 opencv C++

c++ - 编译时函数选择取决于类型大小

c++ - 使用嵌套在模板参数中的类型名

c++ - 为什么 static const char * template struct 成员没有初始化

c++ - 在yaml-cpp中是否可以获取文档中的顶级键名称

c++ - 如何从保存 RGBA 格式图像的缓冲区在 opencv 中创建图像

html - Bootstrap Navbar 格式与模板不匹配

c++ - GoogleMock 模拟非虚函数

c++ - deleted 指针指向什么?

c++ - 没有从 std::function 到 bool 的可行转换