这是我正在使用的代码:
#include <iostream>
#include <type_traits>
using namespace std;
using match_type = void;
using match_type_bad = int;
// version A
template <typename T, typename Attempt = match_type>
struct simple_check : false_type {};
// version B
template <typename T>
struct simple_check<T, T> : true_type {};
int main() {
cout << simple_check<match_type>::value << endl;
cout << simple_check<match_type_bad>::value << endl;
}
具有此模板专长的程序最终输出为:
1
0
由于我一直以为输出应该为1 1
,所以我对C ++的tmp的理解有些混乱。
我的理由是:
使用simple_check<match_type>
进入版本B,然后扩展到simple_check<match_type, match_type>
,该继承自true_type
。因此,1
符合预期。
对simple_check<match_type_bad>
是否适用?
按照这种逻辑,X
中任何类型的simple_check<X>
都应始终为版本B。
当版本A决定使用版本B时,似乎其默认值为match_type
。
为什么版本A影响版本B?可能还有其他东西吗?
答案 0 :(得分:7)
当实例化模板时,在查看专业之前,它始终使用基本版本。由于第二个模板参数的默认值为let count = 0;
$('p input[type="button"]').click(function () {
count += 1;
})
$('#myTable').on('click', 'input[type="button"]', function () {
$(this).closest('tr').remove();
})
$('p input[type="button"]').click(function () {
var varItem = 'item_' + count;
var varCount = 'count_' + count;
var varPrice = 'price_' + count;
var varTotal = 'total_' + count;
$('#myTable').append('' +
'<tr>' +
'<td>' +
'<input type="text" class="form-control" name="' + varItem + '"/>' +
'</td>' +
'<td>' +
'<input type="text" class="form-control" name="' + varCount + '"/>' +
'</td>' +
'<td>' +
'<input type="text" class="form-control" name="' + varPrice + '"/>' +
'</td>' +
'<td>' +
'Count * Price = Total' +
'</td>' +
'<td>' +
'<input type="button" class="btn btn-sm btn-danger" value="Delete" />' +
'</td>' +
'</tr>'
);
calculateTotal();
});
function calculateTotal() {
$('input[name^="count"], input[name^="price"]').on('change', function() {
const inputName = $(this).attr('name').split('_')[1];
const count = +($(`input[name="count_${inputName}"]`).val());
const price = +($(`input[name="price_${inputName}"]`).val());
if(count && price) {
const total = $(`input[name="price_${inputName}"]`).parent().next();
$(total).text(count*price);
}
});
}
calculateTotal();
,因此可以在这里使用。
所以
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="myTable" class="table table-hover table-striped width-full">
<thead>
<tr>
<th>Item</th>
<th>Count</th>
<th>Price</th>
<th>Total</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="text" class="form-control" name="item_0" />
</td>
<td>
<input type="text" class="form-control" name="count_0" />
</td>
<td>
<input type="text" class="form-control" name="price_0" />
</td>
<td>
Count * Price = Total
</td>
<td>
<input type="button" class="btn btn-sm btn-danger" value="Delete" />
</td>
</tr>
</tbody>
</table>
<p>
<input type="button" value="Add Row">
</p>
完成此操作后,编译器将查看这些专业化内容。
专业化仅在模板参数相同的情况下才有效,因此,第一次检查将选择专业化而不是基础模板,第二次检查将使用基本模板,因为专业化无效。