推断大多数模板对象的参数,但在调用模板函数时对其他对象显式? 我注意到,当传递到函数时,现代C++(C++ 11等)有时可以推断出一个模板对象的int >代码>模板参数,而不必使用角括号明确地传递 int 值。p>
但是,如果我想要一个函数参数:推断大多数模板对象的参数,但在调用模板函数时对其他对象显式? 我注意到,当传递到函数时,现代C++(C++ 11等)有时可以推断出一个模板对象的int >代码>模板参数,而不必使用角括号明确地传递 int 值。p>,c++,c++11,templates,C++,C++11,Templates,但是,如果我想要一个函数参数: bitset<N_OLD> 在使用大括号或套管调用函数时显式指定。这可能吗?例如: #include <bitset> using namespace std; // expand or truncate bitset without sign extension template<int N_NEW, int N_OLD> bitset<N_NEW> bresize(const bitset<N_OLD
bitset<N_OLD>
在使用大括号或套管调用函数时显式指定。这可能吗?例如:
#include <bitset>
using namespace std;
// expand or truncate bitset without sign extension
template<int N_NEW, int N_OLD>
bitset<N_NEW>
bresize(const bitset<N_OLD> value)
{
return bitset<N_NEW> {value.to_ullong() & ((1<<N_NEW)-1) };
}
#包括
使用名称空间std;
//扩展或截断不带符号扩展的位集
模板
位组
bresize(常量位集值)
{
返回位集{value.to_ullong()&((1我将给出一个通用的答案,然后我将向您展示如何将其应用于您的案例
不能仅从返回类型推断模板参数
例1
你可以这样称呼它:
bar<double>(24); // R explicit to double, T deduced as int from the parameters
你的案子
首先,std::bitset
的模板参数类型是std::size\t
,而不是int
。仅此一项就会导致演绎问题。请先解决此问题
要确保的下一件事是首先使用非免赔额模板参数:
template<std::size_t N_NEW, std::size_t N_OLD>
std::bitset<N_NEW>
bresize(std::bitset<N_OLD> value) { /* ... */ }
此外,如果N_NEW
可以从N_OLD
计算constexpr
,则可以完全跳过显式参数:
template<std::size_t N_OLD>
std::bitset<N_OLD * 2>
bresize(std::bitset<N_OLD> value) { /* ... */ }
模板
位集
bresize(std::位集值){/*…*/}
或
模板
位集
bresize(std::位集值){/*…*/}
或
constexpr自动新建宽度(std::size\u t旧宽度)=>std::size\u t
{
返回旧的_宽度*2;
/*或任何constexpr允许的主体*/
};
模板
位集
bresize(std::位集值){/*…*/}
或
模板
位集
bresize(std::位集值){/*…*/}
一些次要的离题挑剔:const T
作为参数没有多大意义。
使用const T&
或T
当你说width是什么意思?width是指位集的width参数。例如,对于位集,width是N。模板参数是template。我明白了。你的问题令人困惑,因为模板有模板参数,而不是宽度。对于std::bitset
这是第一个也是唯一一个表示宽度的模板参数。但是你不能说“大多数模板对象的宽度”,因为这毫无意义。我只是想帮你把问题弄清楚。好的。我想我已经解决了。除了标题:p
template <class R, class T>
auto bar(T) -> R;
bar<double>(24); // R explicit to double, T deduced as int from the parameters
template <class T, class U>
auto foo(T, U) -> U
template <class T>
auto foo(T) -> std::decay_t<T>
template<std::size_t N_NEW, std::size_t N_OLD>
std::bitset<N_NEW>
bresize(std::bitset<N_OLD> value) { /* ... */ }
bresize<32>(x);
template<std::size_t N_OLD>
std::bitset<N_OLD * 2>
bresize(std::bitset<N_OLD> value) { /* ... */ }
template<std::size_t N_OLD, std::size_t N_NEW = N_OLD * 2>
std::bitset<N_NEW>
bresize(std::bitset<N_OLD> value) { /* ... */ }
constexpr auto new_width(std::size_t old_width) => std::size_t
{
return old_width * 2;
/* or any constexpr allowed body */
};
template<std::size_t N_OLD>
std::bitset<new_width(N_OLD)>
bresize(std::bitset<N_OLD> value) { /* ... */ }
template<std::size_t N_OLD, std::size_t N_NEW = new_width(N_OLD)>
std::bitset<N_NEW>
bresize(std::bitset<N_OLD> value) { /* ... */ }