Вопрос на шаблонной специализации и получающемся дублировании кода

Когда я получаю эту ошибку, я внедряю все сервисы, используя библиотеку для этой проблемы. Попробуйте, может быть, это поможет вам. @ Mtdavem

public class ServiceGenerator {

   public static String PREF_COOKIES = "pref_cookies";
   private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
   private static Retrofit.Builder builder;

   public static <S> S createService(Class<S> serviceClass) {
    return createService(serviceClass, null);
   }

   public static <S> S createService(Class<S> serviceClass, final HashMap<String, String> headers) {

      builder = new Retrofit.Builder()
            .baseUrl("your service address")
            .addConverterFactory(GsonConverterFactory.create());

      httpClient.sslSocketFactory(getSSLSocketFactory());
      httpClient.hostnameVerifier(new HostnameVerifier() {

         @Override
         public boolean verify(String hostname, SSLSession session) {
            return true;
         }
       });

     OkHttpClient client = httpClient.build();
     Retrofit retrofit = builder.client(client).build();
     return retrofit.create(serviceClass);
   }

   private static SSLSocketFactory getSSLSocketFactory() {

      try {
          // Create a trust manager that does not validate certificate chains
          final TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                    }

                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                }
         };

        // Install the all-trusting trust manager
        final SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
        // Create an ssl socket factory with our all-trusting manager
        final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

        return sslSocketFactory;
      } catch (KeyManagementException | NoSuchAlgorithmException e) {
          return null;
     }

   }
}
5
задан Ash 31 January 2009 в 17:54
поделиться

2 ответа

Можно полностью специализировать участника выборочно:

template<int N>
struct Vector {
    int calculate() { return N; }
};

// put into the .cpp file, or make inline!
template<>
int Vector<3>::calculate() { return -1; }

Вы делаете полную специализацию. Значение Вас не может неравнодушный специализировать его:

template<int N, int P>
struct Vector {
    int calculate() { return N; }
};

// WROOONG!
template<int N>
int Vector<N, 3>::calculate() { return -1; }

При необходимости в этом можно использовать enable_if:

template<int N, int P>
struct Vector { 
    int calculate() { return calculate<P>(); }
private:
    // enable for P1 == 3
    template<int P1>
    typename enable_if_c<P1 == P && P1 == 3, int>::type
    calculate() { return -1; }

    // disable for P1 == 3
    template<int P1>
    typename enable_if_c<!(P1 == P && P1 == 3), int>::type
    calculate() { return N; }
};

Альтернативный подход должен разделить Ваш материал (общий материал в базовый класс, и специализированный материал в производный класс) как Nick рекомендует.

Я обычно проявлял бы второй подход. Но я предпочитаю первый, если я не должен к частичному специализировать функции.

10
ответ дан 18 December 2019 в 13:20
поделиться

Я использовал базовые классы обычно, когда эта ситуация возникает. Т.е.: поместите общую функциональность в базовый класс, и получите шаблонный класс из него, затем специализируйте производный класс только с функциями, которые отличаются.

4
ответ дан 18 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: