簡體   English   中英

如何在模板類型名上編譯時條件?

[英]How to compile-time condition on template typename?

假設我有一個class A模板,如下所示:

template<typename T>
class A
{
    T data;
public:
    void func(){} //concerned function ** see here **
};

現在我有另一個class B模板,說

template<typename U>
class B
{
    // ... something whatever
};

這意味着不構造函數的條件是立即模板typename TB C可以是任何類型,包括AB

  1. 除非使用過,否則不會生成類模板的成員函數。 這是該機制實力的一部分。

  2. 如果要限制此成員函數的使用,則確實可以使用std::is_same 訣竅是定義適當的特征/元功能:

     template<class, template<class...> class> struct is_template_instance : std::false_type {}; template<template<class...> class T, class... Cs> struct is_template_instance<T<Cs...>, T> : std::true_type {}; 

    只會為is_template_instance<std::vector<int>, std::vector>類的東西選擇真正的專業化。 現在只需使用它即可,無論是靜態assert還是std::enable_if

     auto func() -> typename std::enable_if<!is_template_instance<T, B>::value>::type { } 

您需要部分專門化模板:

template<typename C>
class A<B<C>> // Used when A<B<C>> is instantiated
{
    B<C> data;
};

唯一的缺點是,這需要一些代碼重復,而這並非總是可能的。

相反,您可以創建具有所有功能的基類,並從該基類派生:

// Base class with all the common functionality.
template<typename T>
class A_impl
{
protected:
    T data;
};

// Special case when 'func' is available.
template<typename T>
class A : public A_impl<T>
{
public:
    void func() {}
};

// Another special case where 'func' is not available.
template<typename C>
class A<B<C>> : public A_impl<B<C>> {
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM