給定班級
class foo {
public:
void func(std::string s){};
void func(int i){};
void func2(std::string s){};
void func2(int i){};
};
我想通過僅使用模板函式來擺脫多個函式多載。但是,這些函式應該只接受一個 int 或一個 std::string。
我看到了如何使用 c 20 中的概念來實作這一點。但是,我無法訪問具有概念支持的編譯器。
在 c 17 中實作這樣一個目標的方法是什么?我希望能夠使用某種形式的 std::enable_if 或類似形式在模板規范中完成,而不是使用 static_assert。
下面的答案表明這是可以做到的。有沒有辦法只定義一次“模板”定義?
class foo {
template <typename arg_t,
std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>
void func(arg_t arg){}
template <typename arg_t,
std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>
void func2(arg_t arg){}
};
```
uj5u.com熱心網友回復:
使用enable_if您可以撰寫如下函式
template <typename arg_t, std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> ||
std::is_same_v<std::decay_t<arg_t>, std::string>,
bool> = true>
void func(arg_t arg){}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/466809.html
上一篇:在terraform中為Lambda環境變數重用“公共變數”
下一篇:int位域的大小和對齊方式
