推断大多数模板对象的参数,但在调用模板函数时对其他对象显式? 我注意到,当传递到函数时,现代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) { /* ... */ }