2013-07-12 126 views
0

假设我有一个简单的模板类:返回值为模板参数的类模板从函数

template <typename ElementType, ElementType Element> 
class ConsecutiveMatcher 
{ 
public: 
    bool operator() (ElementType lhs, ElementType rhs) 
    { 
     return lhs == Element && rhs == Element; 
    } 
}; 

我通常会做实例比ConsecutiveMatcher<wchar_t, L'\\'>()简单的通过提供可以推断基于该模板参数类型的函数参数类型:

template <typename ElementType> 
ConsecutiveMatcher<ElementType, Element /* ?? */> 
    MakeConsMatcher(ElementType Element) 
{ 
    return ConsecutiveMatcher<ElementType, Element>(); 
} 

然而,在这种情况下,MakeConsMatcher(L'\\')将无法​​正常工作,因为函数需要返回一个类,其模板不仅包含类型,也是一种价值。

如何从一个函数中返回一个类模板,该函数不仅具有类型模板参数,还有值模板参数?

+1

模板是编译时的野兽。如果你在运行时使用各种'Element'值,你可以让'Element'成为一个构造参数吗? – Drop

+0

静态类型在我的用例中是可以的,我只是寻找一种方法来省略'wchar_t'并在实例化过程中使用自动类型推导。我想这是不可能的。 –

回答

0

您想将运行时计算值转换为模板参数吗?这是不可能的。

+0

C++ 11'constexpr'可以这样吗? –

+0

最基本的问题是,您无法将可能的运行时计算值转换为新类型(如果更改模板参数,则需要定义新类型)。 –

1

我只是寻找一种方法来省略wchar_t并在实例化过程中使用自动类型推导。

我能想象这样的情况:

  1. 参数类型仅在运行时知道(你对此没有任何想法):你不能用模板处理它:你将要重新设计您的代码并使用继承和虚函数(或可能混合使用模板和继承)

  2. 参数类型在编译时已知,参数值在运行时已知:lef牛逼类型模板参数列表的说法并传递参数到构造函数,那么,为了用户的方便,使工厂函数来推断类型

    template<typename T> 
    struct MyType 
    { 
        template <class T> 
        MyType(const T& defaultValue) : 
         value(defaultValue) 
        {} 
        T value; 
    }; 
    
    template<typename T> 
    MyType<T> MyFactory(const T& defaultValue) 
    { 
        return MyType<T>(defaultValue); 
    } 
    
    int main() 
    { 
        char c = 'a'; 
        wchar_t w = L'a'; 
        int i = 42; 
        float f = 3.14f; 
    
        auto mt_char = MyFactory(c); 
        auto mt_wchar = MyFactory(w); 
        auto mt_int = MyFactory(i); 
        auto mt_float = MyFactory(f); 
    } 
    
  3. 在编译时,你知道类型的列表并希望他们的行为不同(例如具有不同的默认值):使模板专门为每种类型从列表,然后,为了用户的方便,创建类型定义

    template<typename T> struct MyType 
        { 
         MyType(const T& defaultValue) : 
        value(defaultValue) 
          {} 
    
        T value; 
    }; 
    
    template<> 
    struct MyType <char> 
    { 
        MyType() : 
        value('c') 
        {} 
    
        char value; 
    }; 
    
    
    template<> 
    struct MyType <wchar_t> 
    { 
        MyType() : 
        value(L'w') 
        {} 
    
        wchar_t value; 
    }; 
    
    typedef MyType<char> MyTypeChar; 
    typedef MyType<wchar_t> MyTypeWchar; 
    
    int main() 
    { 
        MyTypeChar mt_char_default; 
        MyTypeWchar mt_wchar_default; 
    } 
    

在这种情况下,用户仍然可以实例化自己的专业化。该方法的示例是std::basic_string类。 此外,可以简化您的专长,如果化妆类成员staticstatic const和整型只是在成员列表定义:

template<> 
struct MyType <char> 
{ 
    static const char value = 'c'; 
};