我正在嘗試使用std::disjuction來測驗引數包是否包含std::wstring,并且我嘗試過的任何東西似乎都不想讓它回傳我期望的值。
這是當前的代碼(https://godbolt.org/z/x99M8avYE):
#include <string>
#include <iostream>
#include <type_traits>
template <typename ...Ts>
using HasWS = std::disjunction<std::is_same<std::wstring,Ts>...>;
template <typename T, typename ...Ts>
using HasWS2 = std::disjunction<std::is_same<T,Ts>...>;
template<typename... Args>
void f(Args&&... args) {
std::cout << HasWS<Args...>::value << std::endl;
std::cout << HasWS2<std::wstring, Args...>::value << std::endl;
std::cout << std::disjunction_v<std::is_same<std::wstring, Args>...> << std::endl;
(std::cout << typeid(args).name() << std::endl, ...);
}
template <typename T, typename ...Ts>
using areT = std::disjunction<std::is_same<T,Ts>...>;
int main() {
std::wstring wstr(L"abc");
std::string str("def");
static_assert(areT<std::wstring,std::string,std::wstring>::value);
static_assert(HasWS<std::wstring,decltype(wstr),decltype(str)>::value);
static_assert(std::is_same<decltype(wstr), std::wstring>::value);
f(wstr, str);
f(str, str);
f(wstr, wstr);
std::cout << std::is_same_v<decltype(wstr), std::wstring> << std::endl;
return 0;
}
如您所見,我正在嘗試不同的呼叫方式,disjuction但沒有一個會找到wstring并回傳 true。我什至低頭列印出包中每個元素的型別,并使用is_same它來確保它wstr實際上是一個wstring.
到底他媽發生了什么?這與我不知道的模板的 pack 引數有關嗎?
uj5u.com熱心網友回復:
注意接收到的引數型別f是轉發參考 Args&&,所以當你傳入一個左值時wstr,Args將被實體化為std::wstring&而不是std::wstring,你應該洗掉參考,例如
template<typename... Args>
void f(Args&&... args) {
std::cout << HasWS<std::remove_reference_t<Args>...>::value << std::endl;
std::cout << HasWS2<std::wstring, std::remove_reference_t<Args>...>::value << std::endl;
std::cout << std::disjunction_v<std::is_same<std::wstring, std::remove_reference_t<Args>>...> << std::endl;
}
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/438903.html
上一篇:C 概念:無論回傳型別是什么,都檢查方法/運算子是否存在
下一篇:C -將模板類的指標傳遞給函式
