我有一个像这样的 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/