c++:定义if语句中的模板



我似乎有以下问题。我有一个包含struct Itemclass BSK(二进制背包(,其中identifier可以是std::stringint。然后我有一个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});
}

最新更新