具有默认值的模板专业化

时间:2019-06-02 08:07:31

标签: c++ c++11 c++14 c++17 template-meta-programming

这是我正在使用的代码:

#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的理解有些混乱。

我的理由是:

  1. 使用simple_check<match_type>进入版本B,然后扩展到simple_check<match_type, match_type>,该继承自true_type。因此,1符合预期。

  2. simple_check<match_type_bad>是否适用?

  3. 按照这种逻辑,X中任何类型的simple_check<X>都应始终为版本B。

当版本A决定使用版本B时,似乎其默认值为match_type

为什么版本A影响版本B?可能还有其他东西吗?

1 个答案:

答案 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>

完成此操作后,编译器将查看这些专业化内容。
专业化仅在模板参数相同的情况下才有效,因此,第一次检查将选择专业化而不是基础模板,第二次检查将使用基本模板,因为专业化无效。