我似乎有以下问题。我有一个包含struct Item
的class BSK
(二进制背包(,其中identifier
可以是std::string
或int
。然后我有一个vector<Items> itemlist_
,我需要在开头插入一个新的Item。我正在尝试做这样的事情,它对int
有效,但对string
无效。非常感谢。
template <class T>
class BKS final
{
public:
struct Item
{
T identifier;
int weight;
int benefit;
};
// some methods ...
}
我正在尝试做这样的事情,它对int
有效,但对string
无效。非常感谢。
if(std::is_same<T, int>::value){
Item toInsert = {0,0,0};
itemlist_.insert(itemlist_.begin(), toInsert);
else{
Item toInsert = {"aa", 0, 0};
itemlist_.insert(itemlist_.begin(), toInsert);
}
问题是if部分和else部分都必须在编译时形成良好的格式。当CCD_ 12是CCD_ 13时,语句CCD_。
您可以使用constexpr if(从C++17开始(。
如果值为true,则丢弃语句false(如果存在(,否则丢弃statement true。
if constexpr (std::is_same<T, int>::value) {
Item toInsert = {0,0,0};
itemlist_.insert(itemlist_.begin(), toInsert);
} else {
Item toInsert = {"aa", 0, 0};
itemlist_.insert(itemlist_.begin(), toInsert);
}
您需要在编译时实例化if的正确部分(仅一个(。普通的if
语句不能做到这一点。阅读更多:
";如果constexpr(("Vs";如果((">
你需要if-constexpr
。
建议:另外,您不需要额外的toInsert
,将临时传递给itemlist_
。
if constexpr (std::is_same<T, int>::value)
{
itemlist_.insert(itemlist_.begin(), {0,0,0});
}
else if constexpr(std::is_same<T, std::string>::value)
{
itemlist_.insert(itemlist_.begin(), {"aa", 0, 0});
}