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'\\')将不起作用,因为该函数需要返回一个类,其模板不仅包含类型,还包含值。

如何从不仅具有类型模板参数而且还具有值模板参数的函数返回类模板?

4

2 回答 2

1

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

于 2013-07-12T16:13:51.507 回答
1

我只是在寻找一种省略 wchar_t 并在实例化期间使用自动类型推导的方法。

我可以想象这样的情况:

  1. 仅在运行时知道的参数类型(您对此一无所知):您无法使用模板处理它:您将需要重新设计代码并使用继承和虚函数(或者,可能混合使用模板和继承)

  2. 编译时知道参数类型,运行时知道参数值:left模板参数列表中的参数类型并将参数传递给构造函数,然后为了用户方便,制作工厂函数来推断类型

    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. 在编译时,您知道类型列表并希望它们具有不同的行为(例如具有不同的默认值):为列表中的每种类型制作模板特化,然后为方便用户创建 typedef

      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';
};
于 2013-07-12T18:48:58.130 回答